c# - 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
现在奇怪的行为也来自快速观察,当然还有结果
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 这个代码运行了 600k 案例,至少有两个我有这种行为,其他人表现得很好。我现在看不到我的错误。问题是.net 为什么会这样?我正在使用带有 .net 4.5.2 的 Visual Studio 2015。
解决方案
问题是优先级 -+
优先级高于??
,因此它“绑定更紧密”。
这是一个完整的示例来演示:
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);
我肯定会??
像大多数其他运算符一样将空格放在圆形中,否则它会给您一种绑定非常紧密的印象(就像.
运算符一样)。
推荐阅读
- kubernetes - 关闭节点时端点更新非常慢
- azure - Azure 响应时间监控每个请求的范围
- json - 使用 REST POST 在映射器中使用 Postman 传递 json 正文 - Snaplogic
- swiftui - Swiftui - 从 UIViewRepresentable 访问 UIKit 方法/属性
- javafx - 为什么 ASCII 艺术在控制台/终端输出等文本字段中看起来不好看?
- dynamics-crm - Dynamics 365:Microsoft Dynamics CRM 遇到错误 System.Runtime.Serialization.SerializationException
- jquery - .Net MVC - 无法阻止我的 Ajax.BeginForm 被黑客入侵
- encryption - Cassandra 集群从未加密状态转变为加密状态
- javascript - Rollup + Typescript + ESLint 错误警告
- asynchronous - Micropython uasyncio websocket 服务器