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规范的副本;值得一读。你可以在我的博客上找到它的链接。