C#隐式强制转换和显式强制转换运算符

示例

C#允许用户定义的类型通过使用explicitandimplicit关键字来控制分配和转换。方法的签名采用以下形式:

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; // 隐式强制转换,注意缺少类型 
bool[] pixels = (bool[])binaryImage; // 显式强制转换,定义类型

强制转换运算符可以同时使用两种方式,您的类型您的类型:

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关键字,它可以参与式层次结构中铸造,是不是在这种情况下有效。即使定义了anexplicit或implicitcast,您也无法执行以下操作:

ColorImage cm = myBinaryImage as ColorImage;

它将产生一个编译错误。