为什么将* nullable * decimal与`0'进行比较与将decimal与'0'进行比较不同?

时间:2012-10-01 09:21:46

标签: c# nullable equality

有人可以解释为什么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;

        }
    }
}   

5 个答案:

答案 0 :(得分:5)

因为System.Decimal公开了可以接受Decimal值的Equals重载,而您的第二种情况是调用 方法(已转换int 1}}参数decimal使用implicit conversion)并返回true。

然而在第一种情况下,Nullable正在尽力而为,但只能调用Object.Equals,这会在intdecimal之间进行比较时失败。如果你的第一个电话是:

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

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


Nullable通用Equals方法既不能调用从intdecimal的隐式转换,也不能调用接受decimal值的等于的重载。

答案 1 :(得分:2)

第一次检查返回false,因为传递给它的值不是十进制类型。如果您将M指定为0,则会得到真实。

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

答案 2 :(得分: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。他们不平等。

答案 3 :(得分:1)

Nullable.Equals

在第一种情况下,将int对象与decimal对象进行比较。 如果你有

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

result1将 true

答案 4 :(得分:-1)

使用时

objOrder.PriceNullable.Equals(0) 它将对象decimal?与0 decimal数字False

进行比较

但是当你做的时候

objOrder.PriceNullable.Value.Equals(0)它比较一个十进制值,该值为0并返回true

执行此操作以获得更多说明

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