2013-04-09 12 views
12

...IComparable magic - なぜそれは有効なステートメントですか?それが働いている理由を私は理解していない

class Program 
{ 
    static void Main(string[] args) 
    { 
     IComparable.Equals(12, 3); 
    } 
} 

ILコード:

.method private hidebysig static void Main(string[] args) cil managed 
{ 
    .entrypoint 
    // Code size  21 (0x15) 
    .maxstack 8 
    IL_0000: nop 
    IL_0001: ldc.i4.s 12 
    IL_0003: box  [mscorlib]System.Int32 
    IL_0008: ldc.i4.3 
    IL_0009: box  [mscorlib]System.Int32 
    IL_000e: call  bool [mscorlib]System.Object::Equals(object, 
                 object) 
    IL_0013: pop 
    IL_0014: ret 
} // end of method Program::Main 

通常、Object.equals(オブジェクト、オブジェクト)をBOOLにコンパイルが、なぜ?

+1

うわー、それは私をうまくやってくれました。 *任意の*(クラス、列挙型)インターフェイス、および任意のパラメータタイプ(もちろんそれについて考える)で動作することに注意してください。 –

+0

実際、すべてのインターフェイスで動作しますが、その理由は何ですか? – boli

+0

ダビデの答えをよく見てください。 –

答えて

12

bool Object.Equals(Object,Object)にコンパイルされますが、それはなぜですか?

「なぜですか?」質問は不正確で、答えるのが難しいので、代わりに「何?」と答えます。質問。

C#仕様のどの部分がこの奇妙な動作の正当性を正当化していますか? C#の仕様の

7.4節では、フォームT.N

のメンバーのルックアップを行っているとき...セットは、アクセス可能なすべてのメンバーが継承されたメンバーを含む、TにNという名前で構成されていること言いますオブジェクトにNという名前のアクセスのメンバーが...

object.EqualsがにEqualsという名前のアクセスメンバーである[強調追加しました] 210なので、それは候補者です。

+1

なぜ、すべてのものを究極の祖先として「オブジェクト」にするように設計されたのですか?そして、私は私の答えを削除する必要があるように見える....... –

+1

奇妙なことに、PowerShellはこれを許可していません。たとえば、PowerShellの 'DayOfWeek :: Equals(12,3)'はうまく動作しますが、 '[IDisposable] :: Equals(12,3)'はメソッドが存在しないと不満を持ちます。 –

+0

答えをありがとう、少なくとも1回はC#の仕様を読む価値があります。 – boli

関連する問題