代码之家  ›  专栏  ›  技术社区  ›  simendsjo

为什么不==和!=默认为Object.Equals,用于ValueTypes?

  •  3
  • simendsjo  · 技术社区  · 15 年前

    对于类,==和!=使用object.referenceequals。但是对于结构,==和!=未定义。

    struct S { }
    S s1 = new S();
    s1 is ValueType; // true
    S s2 = new S();
    object.Equals(s1, s2); // true
    s1 == s2; // operator '==' cannot be applied.
    

    ValueType Equals的默认行为是在所有字段上反射并检查相等性,对吗?为什么不==和!=定义为仅使用Object.Equals for structs?

    然后我看了一眼单声道中的system.int32,看看他们做了什么。Int32派生自 IFormattable, IConvertible, IComparable, IComparable<Int32>, IEquatable<Int32> ,但它不实现==和!=…但仍然,==和!=可按预期用于整数。

    这些接口中的一个或内置的valuetypes上是否发生了编译器的魔力?还是我错过了一些重要的东西?

    编辑: 顺便问一句,原因==不是因为性能原因而在结构上实现的吗?使用反射迭代所有字段可能有点慢…?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Julien Roncaglia    15 年前

    比较 System.Int32 在C标准中定义 14.9.1整数比较运算符 直接映射到IL操作码,如 OpCode.Ceq 因为C编译器中的相等性,所以它们没有被定义为 系统32 直接键入。

    是的,编译器的魔力。

        2
  •  2
  •   yatagarasu    15 年前

    为了用作(您如何称呼它们)类型,也就是objets,应该对valuetypes进行装箱。 拳击是一种表演惩罚,是的。