c# - C#.net 中的添加在某些情况下不起作用

标签 c# .net

<分区>

我有以下案例

beleg.PreisDB = (double?)orders.Where(x => x.orderId == beleg.auftrnr).Sum(x => x.itemPrice + x.shippingPrice + x.giftWrapPrice) ?? 0;
beleg.PreisCouponDB = (double?)orders.Where(x => x.orderId == beleg.auftrnr).Sum(x => x.itemPromotionDiscount + x.shipPromotionDiscount) ?? 0;
var gesamtPreis = Math.Round(beleg.PreisDB??0 + beleg.PreisCouponDB??0, 2);

在我的案例中,我在调试中为某些字段添加了一个快速监视:

beleg.PreisDB == 8.39
beleg.PreisDB??0 == 8.39
beleg.PreisCouponDB == -0.49
beleg.PreisCouponDB??0 == -0.49

现在奇怪的行为也来自 quickwatch,当然还有结果

beleg.PreisDB??0 + beleg.PreisCouponDB??0 == 8.39
Math.Round(beleg.PreisDB??0 + beleg.PreisCouponDB??0, 2) == 8.39
gesamtPreis == 8.39

所以 8.39 + -0.49 的加法不是 7.9 而是 8.39 这段代码在至少两个案例上运行了 60 万个案例,我有这种行为,其他人表现良好。我现在看不到我的错误。问题是为什么 .net 会这样?我将 Visual Studio 2015 与 .net 4.5.2 结合使用。

最佳答案

问题是优先级 - +优先级高于 ?? ,所以它“结合得更紧”。

这里有一个完整的例子来演示:

using System;

class Test
{
    static void Main()
    {
        double? x = 8.39;
        double? y = -0.49;

        // Your expression
        Console.WriteLine(x ?? 0 + y ?? 0);

        // The equivalent you're expecting
        Console.WriteLine((x ?? 0) + (y ?? 0));

        // The actual bracketing
        Console.WriteLine(x ?? ((0 + y) ?? 0));
    }
}

另一种选择是使用 Nullable<T>.GetValueOrDefault()而不是 ?? 0 :

Console.WriteLine(x.GetValueOrDefault() + y.GetValueOrDefault());

但我想我可能只使用带括号的版本 - 所以在你的情况下:

var gesamtPreis = Math.Round((beleg.PreisDB ?? 0) + (beleg.PreisCouponDB ?? 0), 2);

我肯定会把空格放在 ?? 中就像大多数其他运算符一样,否则它会给您印象绑定(bind)非常紧密(就像 . 运算符那样)。

关于c# - C#.net 中的添加在某些情况下不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54920428/

相关文章:

c# - 来自数据库或代码的 DropDownListFor 枚举的 MVC4 最佳实践

c# - 处理非常大的树状数据结构 : OutOfMemoryException

c# - 如何从父窗体标题栏中删除 MDI 子文本? C# 网络

c# - 将 C# 三元与 String.Equals 一起使用

c# - 如何使用 iTextSharp PdfReader 从 PdfFile 获取 UserUnit 属性

c# - 库中的异常处理策略

c# - 仅当属性不为 null 时才进行条件依赖注入(inject)绑定(bind)

c# - ToCharArray 等效于 List<string>

c# - SSIS:C# 中的条件拆分

c# - 调用另一个 Web 服务的 Web 服务是否有任何冲突?