[英]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.