隐式转换和显式转换运算符
C#允许用户定义的类型通过使用 explicit
和 implicit
关键字来控制赋值和转换。该方法的签名采用以下形式:
public static <implicit/explicit> operator <ResultingType>(<SourceType> myType)
该方法不能再使用任何参数,也不能是实例方法。但是,它可以访问其中定义的任何类型的私有成员。
implicit
和 explicit
演员的一个例子:
public class BinaryImage
{
private bool[] _pixels;
public static implicit operator ColorImage(BinaryImage im)
{
return new ColorImage(im);
}
public static explicit operator bool[](BinaryImage im)
{
return im._pixels;
}
}
允许以下强制转换语法:
var binaryImage = new BinaryImage();
ColorImage colorImage = binaryImage; // implicit cast, note the lack of type
bool[] pixels = (bool[])binaryImage; // explicit cast, defining the type
转换运算符可以是双向的,打算从你的类型,并打算给你的类型:
public class BinaryImage
{
public static explicit operator ColorImage(BinaryImage im)
{
return new ColorImage(im);
}
public static explicit operator BinaryImage(ColorImage cm)
{
return new BinaryImage(cm);
}
}
最后,as
关键字,它可以参与式层次结构中转换,是不是在这种情况下有效。即使在定义了 explicit
或 implicit
演员之后,你也做不到:
ColorImage cm = myBinaryImage as ColorImage;
它将生成编译错误。