更新:2007 年 11 月

转换运算符可以是 explicit,也可以是 implicit。隐式转换运算符更容易使用,但是如果您希望运算符的用户能够意识到正在进行转换,则显式运算符很有用。此主题演示了这两种类型。

示例

这是显式转换运算符的一个示例。此运算符将类型 Byte 转换为称为 Digit 的值类型。由于不是所有字节都可以转换为数字,因此转换是显式的,这意味着必须使用强制转换,如 Main 方法所示。

C# 复制代码
struct Digit
{
    byte value;

    public Digit(byte value)  //constructor
    {
        if (value > 9)
        {
            throw new System.ArgumentException();
        }
        this.value = value;
    }

    public static explicit operator Digit(byte b)  // explicit byte to digit conversion operator
    {
        Digit d = new Digit(b);  // explicit conversion

        System.Console.WriteLine("Conversion occurred.");
        return d;
    }
}

class TestExplicitConversion
{
    static void Main()
    {
        try
        {
            byte b = 3;
            Digit d = (Digit)b;  // explicit conversion
        }
        catch (System.Exception e)
        {
            System.Console.WriteLine("{0} Exception caught.", e);
        }
    }
}
// Output: Conversion occurred.

此示例通过定义用来撤消前一个示例所执行的操作的转换运算符,来演示隐式转换运算符:它将名为 Digit 的值类转换为整数 Byte 类型。由于任何数字都可以转换为 Byte,因此没有必要一定让用户知道进行的转换。

C# 复制代码
struct Digit
{
    byte value;

    public Digit(byte value)  //constructor
    {
        if (value > 9)
        {
            throw new System.ArgumentException();
        }
        this.value = value;
    }

    public static implicit operator byte(Digit d)  // implicit digit to byte conversion operator
    {
        System.Console.WriteLine("conversion occurred");
        return d.value;  // implicit conversion
    }
}

class TestImplicitConversion
{
    static void Main()
    {
        Digit d = new Digit(3);
        byte b = d;  // implicit conversion -- no cast needed
    }
}
// Output: Conversion occurred.

请参见