C# IComparable magic-为什么是';这是一个有效的声明吗?

C# IComparable magic-为什么是';这是一个有效的声明吗?,c#,.net,C#,.net,我不明白为什么它会起作用 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

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

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
它编译成bool Object.Equals(Object,Object),但为什么呢

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

“为什么?”问题不精确,很难回答,所以我会回答“什么?”问题

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

C#规范的第7.4节说,当您对表单
T.N

。。。该集合由T中名为N的所有可访问成员组成,包括继承成员和对象中名为N的可访问成员。。。[重点补充]


object.Equals
object
中名为
Equals
的可访问成员,因此它是一个候选成员。

Wow,这让我有一秒钟大吃一惊。请注意,它适用于任何(类、枚举和)接口,当然也适用于任何参数类型(只要您仔细想想),但是它背后的原因是什么?我们可以看到David的答案。
编码也有类似的乐趣:
ascienceoding.Unicode
可以获得
UTF-16
编码。为什么它设计成这样,而不是让所有东西都有
对象作为最终祖先?看起来我需要删除我的答案……奇怪的是,PowerShell不允许这样做。例如,在PowerShell中
[DayOfWeek]::Equals(12,3)
工作正常,但
[IDisposable]::Equals(12,3)
抱怨该方法不存在。感谢您的回答,至少花一次时间阅读C#规范是值得的。@boli:给自己找一份带注释的C#4规范的副本;值得一读。你可以在我的博客上找到它的链接。