gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 09:24:28 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com