2010-07-08 85 views
3

对于类,==和!=使用object.ReferenceEquals。但是对于结构体,==和!=没有定义。为什么==和!=默认为ValueType的object.Equals?

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等于的默认行为是反映在所有字段和检查相等,右..?那么为什么不将==和!=定义为仅使用object.Equals来构造结构?

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

在这些接口之一或内置的valuetypes上是否存在一些编译器魔法?还是我错过了一些关键的东西?

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

回答

2

System.Int32比较在C#规范定义在14.9.1整数比较运算符,因此它们没有被定义为对System.Int32标准运算符被直接映射到IL操作码等OpCode.Ceq在C#编译器平等直接键入。

所以是的编译器魔术是。

2

ValueTypes应被装箱以便用作(如何称呼它们)类型又称为objets。 拳击是一个表现的惩罚,是的。