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

Nic*_*olo 5 c# nullable decimal addition

假设一个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
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是在使用result1进行计算时会发生什么.+和??的优先级如何?运营商?

Eri*_*ert 8

tinstaafl的回答是正确的.扩展它:

??操作是正确的联想+运营商更高的优先级.因此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.括号在后者中是不必要的,但鉴于你对+vs 的优先级感到困惑,这是一个好主意??.