给出以下代码:
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}}超载。
为什么会这样?
答案 0 :(得分:7)
这在3.5 C#语言规范的7.4.3.4节中有所介绍。本节介绍重载决策以及在此过程中如何考虑转换。适用的行是
如果存在从T1到T2的隐式转换,并且不存在从T2到T1的隐式转换,则C1是更好的转换。
在这种情况下,存在从B
到int
(T1)和double
(T2)的隐式转换。存在从int
到double
的隐式转换,但不是相反。因此,从B
到int
的隐式转换被认为更好并获胜。
答案 1 :(得分:0)
由于您没有指定将值转换为编译器正在执行的操作
Console.WriteLine((int)(new B()));
您应该使用以下代替
Console.WriteLine((double)(new B()));