Pio*_*fer 6 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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
结果如评论中所示 - 两行都打印666.
我期望Console.WriteLine(new B());写667,而有一个double超载Console.WriteLine.
为什么会这样?
这在3.5 C#语言规范的7.4.3.4节中有所介绍.本节介绍重载决策以及在此过程中如何考虑转换.适用的行是
如果存在从T1到T2的隐式转换,并且不存在从T2到T1的隐式转换,则C1是更好的转换.
在这种情况下,存在从(T1)和(T2)B两者的隐式转换.有一种隐含的转换,但不是相反的转换.因此,从隐式转换到被认为是更好的和胜利.intdoubleintdoubleBint