最近我很惊讶地发现编译器在比较接口(interface)引用方面显然并不严格,我想知道为什么它会这样工作。
考虑这段代码:
class Program
{
interface I1 {}
interface I2 {}
class C1 : I1 {}
class C2 : I2 {}
static void Main(string[] args)
{
C1 c1 = new C1();
C2 c2 = new C2();
I1 i1 = c1;
I2 i2 = c2;
bool x = c1 == c2;
bool y = i1 == i2;
}
}
编译器说我无法比较 c1 == c2
,如下所示。类型完全不相关。然而,它确实允许我比较 i1 == i2
。我预计它会因编译时失败而出错,但我惊讶地发现您可以将任何接口(interface)与任何其他接口(interface)进行比较,编译器永远不会提示。我可以比较,例如 (I1)null == (IDisposable)null
没问题。
接口(interface)不是对象吗?它们是一种特殊类型的引用吗?我的期望是 ==
会导致直接引用比较或调用具体类的虚拟 Equals。
我错过了什么?
最佳答案
我想这是以这种方式完成的,因为您可以拥有一个继承两个接口(interface)的类型,对于这种情况,这种比较可能很有用:
interface I1 {}
interface I2 {}
class C1 : I1, I2 {}
所以在第一种情况下,编译器肯定知道对象是不同的,但在第二种情况下,它们可能不是。
关于c# - 为什么可以比较不相关的c#接口(interface)引用而不会出现编译错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4020897/