考虑以下类型:
class A { }
class B { }
interface IC { }
A a = null; // the value doesn't matter - null or anything else, for all three
B b = null;
IC c = null;
var x = a == b;
但以下确实编译(我惊讶地发现):
var x = a == c;
据我了解,编译器回退到使用默认的 == 运算符,该运算符是在 object 上定义的,因此可以接受任何类型的参数。IL 看起来像这样(忽略 的细节ldfld
):
ldarg.0
ldfld class A a
ldarg.0
ldfld class IC c
ceq
stloc.0
换句话说,它使用引用相等。
我的问题:
在语言设计方面,为什么这有意义?对我来说不是,我认为这是一个很大的陷阱。
如果这确实是一个陷阱,代码分析不应该警告我们吗?(不 - 它没有)。顺便说一句,ReSharper 似乎有这个功能。