【发布时间】:2014-06-05 23:05:25
【问题描述】:
在C#中为什么Double会覆盖==而Int32不会,效果如何?
我在看msdn库。
我看到这个关于 double 的链接并没有说太多 here (虽然我知道 double 是 Double 对象的简写)..它没有显示方法例如..
但是System.Double 上的这个链接确实提到了我正在寻找的东西here
它显示 Equality 运算符采用双精度,因此重载。
MSDN 中Double 的图像,然后在方法之后(在列出字段之前),它显示运算符,并显示相等运算符被覆盖
我可以点击“运算符”下的平等和it says
public static bool operator ==(
double left,
double right
)
而当我看到System.Int32
MSDN中Int32的图片如下
看那张图片,(System.Int32 的页面)看起来== 没有被覆盖。
为什么,这样做的后果是什么?
【问题讨论】:
-
看起来文档不完整或幕后发生了一些事情,因为从文档页面中它说:“Int32 类型支持标准数学运算,例如加法、减法、除法、乘法、否定和一元否定。与其他整数类型一样,Int32 类型也支持按位与、或、异或、左移和右移运算符。您可以使用标准数值运算符来比较两个 Int32 值,也可以调用 CompareTo 或 Equals 方法。”
-
@TyCobb 使用 ILSpy 发帖的人表明该方法存在,所以这可能表明它不是生成的代码.. 他还建议它反编译。而且,我并不怀疑它调用了 Equals 方法,但是你能引用什么来说明这一点吗?
-
@TyCobb 正在查看 Matt 发布的内容。第一个和第三个 WriteLine() 给出不同的结果。所以 == 和 .Equals 的行为不一样。所以, == 不会调用
.Equals(..),同意吗? -
@barlop 是的,毫无疑问。 TyCobb 也表明,对于 In32,== 不会调用 .Equals。没有理由认为他们中的任何一个都会发生这种情况。
-
您不能实际调用运算符,C# 编译器具有内置的值类型知识,并且始终发出 Opcodes.Ceq。它们仅充当文档占位符,用于记录 IEEE-754 标准的怪异行为。