C# 为什么Equals()和==设计得不同?

C# 为什么Equals()和==设计得不同?,c#,C#,这个问题不是关于=和等于之间的区别。这是关于为什么它们的设计不同 我们知道这些差异会导致许多问题,这些问题肯定很容易被发现: Equals和=对同一实体的两个实例产生不同的结果 比较子类时,=会产生不同的结果,因为=不是多态的 简而言之,C语言设计团队和.NET framework设计团队无法就如何最好地比较值/对象以获得相等性达成一致,因此各自实现了自己的系统 有关更技术性的详细答案,请参阅 史蒂夫,在你下结论之前先看一下我问题的第一行怎么样?这不是区别,而是为什么设计不同。这是一个完全不同

这个问题不是关于
=
等于
之间的区别。这是关于为什么它们的设计不同

我们知道这些差异会导致许多问题,这些问题肯定很容易被发现:

  • Equals
    =
    对同一实体的两个实例产生不同的结果
  • 比较子类时,
    =
    会产生不同的结果,因为
    =
    不是多态的

    • 简而言之,C语言设计团队和.NET framework设计团队无法就如何最好地比较值/对象以获得相等性达成一致,因此各自实现了自己的系统


      有关更技术性的详细答案,请参阅

      史蒂夫,在你下结论之前先看一下我问题的第一行怎么样?这不是区别,而是为什么设计不同。这是一个完全不同的问题。@Claies我认为这足够不明显了。Claies,我当然不知道,因为我所有的搜索都指向不同的解释。他们没有一个人谈论不同的目的。你为什么不解释一下不同的目的或者发布一个链接呢?@ThomasEyde==在比较子类时会产生不同的结果,因为==不是多态的,我通常在“基类”中定义
      =
      来调用
      Equals
      ,所以我解决了这个问题…@ThomasEyde它表明你问题的第2点是90%没有意义的(如果你“控制”基类是没有意义的)。这可以从IL语言中不支持运算符这一事实来证明。它们是由C#编译器(以及其他“兼容”语言)使用方法(具有特定名称和特殊名称)“构建”的flag…CLS中没有运算符重载。但是,CLS提供了有关提供有用名称(例如Add())的指导原则并在元数据中设置一点。选择支持运算符重载的编译器应该遵循这些指导原则,但不需要这样做。前C#语言设计师Eric Lippert同意框架设计师可能做出了正确的框架决策,因此您过度简化的解释变得非常不准确。您的然后,swer会比一个只有链接的答案更糟糕,因为它歪曲了它所指向的lik。@PieterGeerkens,有两个(实际上是三个,但我们还是坚持两个)在C#/.NET中实现平等的方法。因此,如果你排除了两个团体不能达成一致的可能性,并实施了两种不同的制度,那么我们的想法是,一个共识团体认为创建两个不兼容的平等制度是一个好主意。不知何故,我认为我的总结远非“严重不准确”这是一个非常准确的事实陈述,因为替代方案非常令人担忧。@xanatos,这与HansPassant的回答不矛盾吗?@ThomasEyde如果你打开他指的PDF(他删除了答案,但链接是到),你会看到唯一一个命名为
      op_Equality
      的地方(除了索引)在公共语言规范的
      I.10名称和类型规则中