[英]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
从未计算过。 这不是你想要的行动; 你可以用(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.