我认为Object.Equals(Object,Object)支持按位相等而不是值相等

use*_*769 15 c#

静态方法Object.Equals(Object, Object)支持引用类型的引用相等性和值类型的按位相等性,其中具有逐位相等性的比较对象具有相同的二进制表示,而比较的值相等对象具有相同的值,即使它们具有不同的二进制表示.

例如,由于i1b1不同类型,它们没有相同的二进制表示,因此Object.Equals(Object, Object)返回false:

        int  i1 = 100;
        byte b1 = 100;
        Console.WriteLine(Object.Equals(i1, b1));//false
Run Code Online (Sandbox Code Playgroud)

Object.Equals(Object, Object)也应该在比较时返回false d1并且d2(因为两个变量具有相同值的不同二进制表示),但它返回true,这表明它使用值相等来比较它们:

        decimal d1 = 1.10M;
        decimal d2 = 1.100M;
        Console.WriteLine(Object.Equals(d1, d2)); //true
Run Code Online (Sandbox Code Playgroud)

不应该Object.Equals(Object, Object)进行比较时,返回False d1d2

来自http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx:

例如,考虑两个表示数字1.10和1.1000的Decimal对象.Decimal对象没有按位相等,因为它们具有不同的二进制表示以说明不同数量的尾随零.

感谢名单

Dev*_*eam 9

Decimal是值类型,Equals方法实际上使用Reflection比较其所有字段.有关更多详细信息,请参阅MSDN:

ValueType.Equals方法

最后,MSDN的范围不完整.这里是:

例如,考虑两个表示数字1.10和1.1000的Decimal对象.Decimal对象没有按位相等,因为它们具有不同的二进制表示以说明不同数量的尾随零.但是,对象具有值相等性,因为对于比较目的,数字1.10和1.1000被认为是相等的,因为尾随零是无关紧要的.


Ric*_*der 7

Object.Equals应该实现值(非按位)相等.

在Decimal情况下,两个对象的类型相同且值相等,因此结果为true.

在int,byte的情况下,对象的类型不同,因此结果为false.

  • 几乎所有Object.Equals(x)的覆盖都返回false,如果x不是正确的类型.通常,该方法的第一个语句是"if(!(x is typeof(...))return false;"或某些变体. (2认同)

Jas*_*yon 5

您可以使用像reflector这样的工具查看Object.Equals(Object,Object)的来源.

这是Object.Equals(Object,Object)的源代码:

public static bool Equals(object objA, object objB)
{
    return ((objA == objB) || (((objA != null) && (objB != null)) && objA.Equals(objB)));
}
Run Code Online (Sandbox Code Playgroud)

我们来看看这些条款:

(objA == objB):这是对象相等运算符,它检查这两个对象是否引用同一对象.这个条款对我们来说是错误的.

(objA != null) && (objB != null):这适用于我们的情况.

objA.Equals(objB):这是真的(它委托给Decimal.Equals(Object))

我们已经完成了运算符true的RHS ||,因此整个语句的计算结果为true.


cwh*_*ris 1

来自 MSDN:

http://msdn.microsoft.com/en-us/library/w4hkze5k.aspx

请注意,派生类型可能会重写 Equals 方法以实现值相等。值相等是指比较的对象具有相同的值但不同的二进制表示形式。

Decimal 肯定有一个 Equals 覆盖,如元数据中所示。