IComparable magic - 为什么它是一个有效的声明?

bol*_*oli 12 .net c#

我不明白它为什么会起作用......

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

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
Run Code Online (Sandbox Code Playgroud)

它编译为bool Object.Equals(Object,Object),但为什么呢?

Eri*_*ert 12

它编译bool Object.Equals(Object,Object),但为什么?

"为什么?" 问题不精确且难以回答,所以我会回答"什么?" 题.

C#规范的哪一部分证明了这种奇怪行为的合法性?

C#规范的第7.4节说明当您对表单进行成员查找时 T.N

...该集由T中名为N的所有可访问成员组成,包括继承成员和对象中名为N的可访问成员 ... [强调添加]

object.Equals名为可访问成员Equalsobject,所以它是一个候选人.