为什么没有==和!=默认为ValueTypes的object.Equals?

时间:2010-07-08 14:49:20

标签: .net struct equality

对于类,==和!=使用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?

然后我看了一下Mono中的System.Int32看看他们做了什么.. Int32派生自IFormattable, IConvertible, IComparable, IComparable<Int32>, IEquatable<Int32>,但它没有实现==和!= ......但是,仍然,==和! =可以按预期使用整数。

是否在其中一个接口或内置的valuetypes上发生了一些编译器魔术?或者我错过了一些关键的东西?

编辑:顺便说一句,出于性能原因,原因==是否在结构上没有实现?使用反射迭代所有字段可能有点慢......?

2 个答案:

答案 0 :(得分:2)

ValueTypes应该加框,以便用作(如何调用它们)类型也称为objets。 拳击是一种表现惩罚,是的。

答案 1 :(得分:2)

System.Int32的比较在 14.9.1整数比较运算符中的C#规范中定义,并直接映射到IL编码,如OpCode.Ceq,以确保C#编译器中的相等性所以它们没有直接定义为System.Int32类型的标准运算符。

所以编译器就是魔术。