C#添加可空小数和优先级?? *** 作者

C#添加可空小数和优先级?? *** 作者,第1张

概述假设一个C#程序具有两个可为空的十进制属性A和B. 以下添加仅返回A的值: var result = A ?? 0 B ?? 0; 正确的用法是: var result =(A ?? 0)(B ?? 0); 示例控制台程序: class Program{ static void Main(string[] args) { A = (decimal)0.11; 假设一个C#程序具有两个可为空的十进制属性A和B.
以下添加仅返回A的值:
var result = A ?? 0 B ?? 0;
正确的用法是:
var result =(A ?? 0)(B ?? 0);

示例控制台程序:

class Program{    static voID Main(string[] args)    {        A = (decimal)0.11;        B = (decimal)0.69;        NullableDecimalAddition();        Console.Readline();    }    public static decimal? A { get; set; }    public static decimal? B { get; set; }    private static voID NullableDecimalAddition()    {        decimal result1 = A ?? 0 + B ?? 0;        decimal result2 = (A ?? 0) + (B ?? 0);        Console.Writeline("result1: " + result1);  // = 0.11        Console.Writeline("result2: " + result2);  // = 0.80    }}

我的问题是在使用result1进行计算时会发生什么.怎么是和?的优先级 *** 作符?

解决方法 tinstaafl的回答是正确的.扩展它:

?? ??运算符是右关联的,运算符的优先级更高.因此A ?? 0 B ?? 0相当于A ?? ((0 B)?? 0),而不是(A ?? 0)(B ?? 0).

因此A ??的作用0 B ?? 0是:

>计算A,您声明的类型为可为空的十进制.如果它为非null,则获取其十进制值作为结果.我们现在完成了; B从未计算过.
>编译器已将零转换为十进制,并且省略了对提升算术的空检查. (有关详细信息,请参阅my series of articles on how nullable arithmetic is optimized by the compiler.)
> B被计算并检查为空.如果为null,则加法结果为null;如果没有,则添加的结果是可以为空的小数.
>现在检查添加的结果是否为空.如果为null,则结果为零(同样,已经转换为十进制).如果它不为null,则获取其值并且该值将成为结果.

这不是你想要的行动;你可以用(A ?? 0)(B ?? 0)获得你想要的动作.如果您的意图相反意味着“如果任何一方为空则使用零”那么你可以使用(A B)?? 0.括号在后者中是不必要的,但鉴于你对vs ??的优先级感到困惑,这是一个好主意.

总结

以上是内存溢出为你收集整理的C#添加可空小数和优先级?? *** 作者全部内容,希望文章能够帮你解决C#添加可空小数和优先级?? *** 作者所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1250472.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存