重载显式CAST运算符

时间:2012-01-09 17:08:26

标签: c# .net casting proxy operator-overloading

我有这段代码:

public class Leg : ProxiestChild
{
    public virtual Name { get; set; }
}
问题是:

var leg = new Leg(); // leg is not Leg, instead ProxiedLeg

var trueleg = (Leg)leg; // exception leg is a ProxiedLeg

我需要这样的东西

public class ProxiestChild
{
    // some method that overloads explicit CAST
    // where receiving the proxied object i returns the unproxied object
    // to be casted
}

1 个答案:

答案 0 :(得分:13)

您可以使用转化运算符implicitexplicit实现自定义类型转换。

转换运算符可以是显式的也可以是隐式的。隐式转换运算符更易于使用,但当您希望运算符的用户意识到正在进行转换时,显式运算符非常有用。本主题演示了这两种类型。

实施例

这是显式转换运算符的示例。此运算符从类型Byte转换为名为Digit的值类型。因为并非所有字节都可以转换为数字,所以转换是显式的,这意味着必须使用强制转换,如Main方法中所示。

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,所以无需强制用户明确转换。

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.

来自:http://msdn.microsoft.com/en-us/library/85w54y0a(v=VS.100).aspx

要小心这一点,为了便于阅读,看到一种神奇地投射到另一种类型通常会让人感到困惑 - 人们并不总是首先认为存在转换操作符。