6

给定以下代码:

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。

我希望写667 Console.WriteLine(new B());,而.doubleConsole.WriteLine

为什么会这样?

4

2 回答 2

7

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

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

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

于 2013-02-08T17:07:06.397 回答
0

由于您没有指定将值转换为编译器正在做什么

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

您应该改用以下内容

Console.WriteLine((double)(new B()));
于 2013-02-08T17:05:03.500 回答