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を出力します。

のオーバーロードがConsole.WriteLine(new B());あるときに、667 を書き込むことを期待します。doubleConsole.WriteLine

なぜそれが起こっているのですか?

4

2 に答える 2

7

これは、3.5 C# 言語仕様のセクション 7.4.3.4 でカバーされています。このセクションでは、オーバーロードの解決と、このプロセスで変換がどのように考慮されるかについて説明します。該当する回線は

T1 から T2 への暗黙的な変換が存在し、T2 から T1 への暗黙的な変換が存在しない場合は、C1 が適切な変換になります。

この場合、 (T1) と(T2)Bの両方への暗黙的な変換があります。からへの暗黙の変換がありますが、その逆はありません。したがって、 からへの暗黙的な変換がより適切であると見なされ、優先されます。intdoubleintdoubleBint

于 2013-02-08T17:07:06.397 に答える
0

値をコンパイラにキャストするものを指定していないため、コンパイラが行っています

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

代わりに以下を使用する必要があります

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