【发布时间】:2011-06-03 02:48:15
【问题描述】:
我已阅读以下关于 C# 值类型比较的声明 在 C# 中深入第二版。
第 77 页,
当类型参数不受约束(未对其应用约束)时,您可以使用 == 和 != 运算符,但只能将该类型的值与 null 进行比较。您不能将 T 类型的两个值相互比较。
...
当类型参数被限制为值类型时,== 和 != 根本不能与它一起使用。
如果我理解正确(我不这么认为),它基本上告诉我你不能 使用 == 或 != 比较两种值类型。为什么为什么为什么?
如果能针对这种情况给出一个简单的例子就更好了。谁能给我 对上面这段试图传达的内容有一点了解吗?
【问题讨论】:
-
我怀疑这是为了避免与运算符重载混淆,因为当泛型类型参数是值类型时,将不会使用重载的 == 运算符。但是,您可以使用 Object.Equals,哪些行为良好的值类型将实现以及与 == 具有相同的行为(对于行为良好的类型)。
-
@Dan Bryant,这不仅是为了避免混淆。无法保证值类型支持 == 和 != 运算符,并且我们不能将 System.Object 实现用于值类型,因为测试引用相等性仅适用于装箱实例。理论上,我们可以指定将操作数装箱以使用引用相等检查,但表达式将始终为假,这显然是无用的。
-
@phoog,静态的
Object.Equals实际上会调用 Object 的 Equals 实现(即使它是装箱的值类型),因此它是比较偶数类型的有效方法。它还处理 null 与值类型的比较。Object.ReferenceEquals显式强制检查引用相等,这在引用类型覆盖相等运算符但对空比较情况有错误的情况下会很有帮助(我之前在第三方 API 中遇到过这种情况.) -
@Dan Bryant,是的,静态(也是实例)对象。Equals 将按照您的描述进行操作。问题是 == 运算符不这样做,因此在泛型类型参数是值类型的情况下,不可能有意义地应用该运算符。
标签: c# generics comparison operators