繁体   English   中英

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

[英]C# addition with nullable decimals and precedence of ?? operator

假设一个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 ?? ((0 + B) ?? 0) ,不是(A ?? 0) + (B ?? 0)

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

  • 计算A ,您声明的类型为可空小数。 如果它为非null,则获取其十进制值作为结果。 我们现在完成了; B从未计算过。
  • 编译器已经将零转换为十进制,并且省略了对提升算术的空检查。 (有关详细信息,请参阅我的系列文章,了解编译器如何优化可空算术 。)
  • 计算B并检查空值。 如果为null,则加法结果为null; 如果没有,则添加的结果是可以为空的小数。
  • 现在检查添加的结果为null。 如果为null,则结果为零(同样,已经转换为十进制)。 如果它不为null,则获取其值并且该值将成为结果。

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

如果没有第一个语句中的(),你会告诉第一个? 如果A为空,则运算符返回0 + B,第二个?? 如果B为null,则运算符返回0。 因此,+运算符正被?? 运算符语句只返回A.如果将A设置为null,则返回.69

我认为更重要的是,你不应该把它留给任何人的解释,这是一个明显的例子,你应该总是使用括号来提高可读性和避免怀疑。 维护是一个优先事项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM