.net - 为什么 == 和 != 不默认为 object.Equals 的 ValueTypes?

标签 .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 的默认行为是反射(reflect)所有字段并检查相等性,对吧..?那么,为什么不将 == 和 != 定义为仅将 object.Equals 用于结构?

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

这些接口(interface)之一或内置值类型是否发生了一些编译器魔法?还是我在这里遗漏了一些重要的东西?

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

最佳答案

比较 System.Int3214.9.1 整数比较运算符 中的 C# 规范中定义,并直接映射到 IL 操作码,如 OpCode.Ceq对于 C# 编译器中的相等性,因此它们不会直接定义为 System.Int32 类型上的标准运算符。

是的,它是编译器的魔法。

关于.net - 为什么 == 和 != 不默认为 object.Equals 的 ValueTypes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3204827/

相关文章:

javascript - 如何确定两个 ES6 类实例是否相等?

c# - 未知数量列表的交集 c# .net

c# - 如何配置 Ninject 与 ServiceStack.net 一起工作

c++ - 如何在使用 g++ 编译器时使用 c 样式初始化结构?

string - Smalltalk/Squeak string 浅平等

python - 不覆盖比较运算符的 Python 对象是否等于自身?

c# - 1 个解决方案中的 VB.Net 和 C# 项目

.net - 在终端中调试 dotnet 核心程序

c - 初始化结构数组

c - "struct user* "和 "struct user *"有什么区别?