【问题标题】:overloading explicit CAST operator重载显式 CAST 运算符
【发布时间】:2012-02-06 05:10:46
【问题描述】:

我有这段代码:

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
}

【问题讨论】:

  • 您的代码不清楚,因为它确实创建了Leg 的实例。您能否展示一个简短但完整的程序来实际演示该问题 - 并为我们提供更多关于您为什么要这样做的背景信息?
  • @Adam Houldsworth 正是我所需要的(非常酷的链接),谢谢,您能否让您的回答给它评分?
  • @manuellt 我已经创建了答案,虽然我同意 Jon 的 cmets,但 OP 代码有点误导。
  • 谢谢,我在stackoverflow.com/questions/8833227/…987654322@

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


【解决方案1】:

您可以使用转换运算符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

请注意这一点,为了可读性,看到一种类型神奇地转换为另一种类型通常会令人困惑 - 人们并不总是首先认为有转换运算符在起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多