为什么将可空十进制数与 `0` 进行比较与将十进制数与 `0` 进行比较不同?

7

有人能解释一下为什么result1falseresult2true吗?代码如下:

namespace TestCsharp
{
    class Program
    {
        static void Main(string[] args)
        {
            Order objOrder = new Order(0.0M);

            bool result1 = objOrder.PriceNullable.Equals(0);//returns false
            bool result2 = objOrder.PriceNullable.Value.Equals(0);// returns true
        }
    }

    public class Order
    {
        public decimal? PriceNullable { get; set; }
        public Order(decimal? priceNullable)
        {
            PriceNullable = priceNullable;

        }
    }
}   

相关问题:Equals和GetHashCode方法的不一致性 - CodesInChaos
5个回答

5
因为 System.Decimal 公开了一个重载的 Equals 方法,可以接受一个 Decimal 值,而你的第二个情况是调用了该方法(使用 隐式转换int 参数转换为 decimal),并返回 true。
而在第一个情况中,Nullable 尽力而为,但只能调用 Object.Equals,当比较 intdecimal 时会失败。如果你的第一个调用是:
bool result1 = objOrder.PriceNullable.Equals(0M);

您将比较两个decimal,并且现在它会返回true


< p > Nullable 泛型 Equals 方法既不能调用从 intdecimal 的隐式转换,也不能调用接受 decimal 值的 equals 重载。


我明白了。当我们给“PriceNullable”赋值时,它会被转换为“decimal”(因为“PriceNullable”是decimal类型),所以我们需要将“PriceNullable”与decimal值进行比较。 - Yaqub Ahmad

2

第一个检查返回 false 是因为传递给它的值不是十进制类型。如果你指定 M 为 0,你将得到 true。

bool result1 = objOrder.PriceNullable.Equals(0M);

1
如果我们查看 Nullable<T>.Equals 的定义:
 /// <summary>
 /// Indicates whether the current <see cref="T:System.Nullable`1"/> object is equal 
 /// to a specified object.
 /// </summary>
 ///...
 // true if the <paramref name="other"/> parameter is equal to the current 
 // object; otherwise, false. 
        public override bool Equals(object other);

所以你比较了 Nullable<decimal> 和一个 int。它们不相等。


1

Nullable.Equals

在第一种情况下,您将整数对象与十进制对象进行比较。 如果您有


bool result1 = objOrder.PriceNullable.Equals(0.0M);

result1 的值将会是true


-1

当你使用

objOrder.PriceNullable.Equals(0) 它会将decimal?对象与0进行比较,这是一个decimal数字,结果为False

但是当你执行

objOrder.PriceNullable.Value.Equals(0) 它会将一个值为0的decimal进行比较,并返回true

为了更清楚,请执行此操作

decimal? nullableZero = 0;
bool result3 = objOrder.PriceNullable.Equals(nullableZero);// returns true

1
-1 没有解释真正的问题,即在一个情况下从intdecimal的隐式转换,而在另一个情况下没有这种转换。 - CodesInChaos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接