重载转换运算符的转换规则

时间:2013-02-08 17:00:29

标签: c# operator-overloading

给出以下代码:

using System;

namespace Test721
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            Console.WriteLine(new A()); //prints 666
            Console.WriteLine(new B()); //prints 666
            Console.ReadLine();
        }
    }

    public class A
    {
        public static implicit operator int(A a)
        {
            return 666;
        }
    }

    public class B : A
    {
        public static implicit operator double(B b)
        {
            return 667;
        }
    }
}

结果如评论中所示 - 两行都打印666。

我希望Console.WriteLine(new B());能够写出667,而double的{​​{1}}超载。

为什么会这样?

2 个答案:

答案 0 :(得分:7)

这在3.5 C#语言规范的7.4.3.4节中有所介绍。本节介绍重载决策以及在此过程中如何考虑转换。适用的行是

  

如果存在从T1到T2的隐式转换,并且不存在从T2到T1的隐式转换,则C1是更好的转换。

在这种情况下,存在从Bint(T1)和double(T2)的隐式转换。存在从intdouble的隐式转换,但不是相反。因此,从Bint的隐式转换被认为更好并获胜。

答案 1 :(得分:0)

由于您没有指定将值转换为编译器正在执行的操作

Console.WriteLine((int)(new B()));

您应该使用以下代替

Console.WriteLine((double)(new B()));