c# - 为什么可以比较不相关的c#接口(interface)引用而不会出现编译错误?

标签 c# interface

最近我很惊讶地发现编译器在比较接口(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/

相关文章:

java - 工厂模式/ArrayList/接口(interface)问题

c# - 优化我的方法

c# - 静态变量初始化

go - 避免在 "subtypes"之间重复代码

eclipse - 跳转到 Eclipse IDE 中的接口(interface)实现

java - PECS 不适用于具有接口(interface)的返回类型

c# - 模拟单元测试在 AsNoTracking() 上返回 ArgumentNullException

c# - 如何排队服务器 ASP.NET 完成的工作

c# - 验证失败(C# .NET HMACSHA256 类)

c# - Web服务代理类实现接口(interface)