c# - 为什么将 *nullable* 小数与 `0` 进行比较不同于将小数与 `0` 进行比较?

标签 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;

        }
    }
}   

最佳答案

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

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

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

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


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

关于c# - 为什么将 *nullable* 小数与 `0` 进行比较不同于将小数与 `0` 进行比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12670534/

相关文章:

c# - 使用国际键盘时 WPF 应用程序在 Windows 10 上崩溃

c# - 为什么 Visual Studio 报表数据屏幕不显示所有可用的数据集?

android - 将 kotlin 转换为 java 后,Notnull 变量变为可为空

当 set 包含元素时,java set.contains() 给出 false?

.net - == 是如何工作的以及它在 .NET 内部的作用

c# - Mono.Cecil 能否修改已加载到 AppDomain 中的代码?

c# - 如何在ajax调用后重置表单

c# - LINQ 2 实体,如何在 linq 查询中检查 DateTime.HasValue

c# - 为什么从 <T> 到 <U> 的隐式转换运算符接受 <T?>?

coq - 不同等式证明的示例