.net 为什么';t==和!=默认为object。ValueTypes是否等于?

.net 为什么';t==和!=默认为object。ValueTypes是否等于?,.net,struct,equality,.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.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、IEquatable
,但它没有实现==和!=。。。但仍然,==和!=可以按预期在整数上使用

这些接口中的一个或内置的ValueType是否有一些编译器魔法?还是我遗漏了一些重要的东西


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

ValueTypes应该装箱,以便用作(您如何称呼它们)类型或对象。 装箱是一种性能损失,是的。

的比较在14.9.1整数比较运算符的C#范数中定义,并直接映射到IL操作码,如C#编译器中的等式,因此它们不被定义为
系统上的标准运算符。Int32
直接键入

所以是的