在C#(空類型)輸出(在C#空類型)
int a = 10;
int? b = 20;
int? c = null;
System.Console.WriteLine(a+c??b);
輸出是:20
如果(C 12 B + A),則輸出是30
我不不明白爲什麼..
在C#(空類型)輸出(在C#空類型)
int a = 10;
int? b = 20;
int? c = null;
System.Console.WriteLine(a+c??b);
輸出是:20
如果(C 12 B + A),則輸出是30
我不不明白爲什麼..
C 12 B + A被評估爲
c?? (b+a)
或略微膨脹
c == null ? b + a : c
,或者如果我們使用實際值
null == null ? 20 + 10 : null)
而A + C代替? ?b被評估爲
(a+c)??b
,或者如果我們稍微擴大
(a + c) == null ? b : c+a
,或者如果我們用實際值替代
(10 + null) == null ? 20 : 10 + null
這又可以縮短到
null == null ? 20 : null
加法運算的可空類型如果至少有一個操作數爲空,則總是返回null
這不就是原始海報的想法嗎?如果'''真的更強,他**可以**改變加數的順序。 –
@JeppeStigNielsen這是一個錯字,現在糾正 –
現在,它是混亂。 'c? b + a'更像:'c == null? (b + a):c' –
當你寫:
System.Console.WriteLine(a+c??b);
這將有效地評價:
int? temp = a + c;
System.Console.WriteLine(temp ?? b);
「溫度」 上面是空,所以你得到的b
結果。
運算符??
用於檢查空值。它會返回有問題的值,或者返回空值。
c ?? b
表示「c,除非c爲空,在這種情況下b」。
c ?? b + a
檢查c,看到它爲空,並使用b(20)代替。然後它增加了一個(10)得到30. *
a + c ?? b
似乎應用??
到a + c
而不是僅僅對c,導致整個事情被替換爲b(20)。
*不確定在這種情況下的操作順序,可能由於c爲空而使用(b + a)。
另外,爲了正確,「'c ?? b + a'檢查'c',並且看到它是空的,並且使用**'b + a' **來代替。因此它評估'b + a'。 –
這只是一個優先問題。
此:
System.Console.WriteLine(a + c ?? b);
相當於:
System.Console.WriteLine((a + c) ?? b);
a + c
爲空(由於c
爲空),因此20被打印(的b
的值)
鑑於此:
System.Console.WriteLine(c ?? b + a);
相當於:
System.Console.WriteLine(c ?? (b + a));
c
爲空,因此,RHS(b + a
)進行評價,這是30.
有什麼問題。 'a + c' **是** null。 –
@JeppeStigNielsen:抱歉,布魯諾。現在修復。 –
檢查這裏:ECMA-334: 14.2.1 Operator precedence and associativity
空合併的優先級順序運算符(??)遠小於'+'。所以,'+'總是首先被評估。
在你的情況,
int a = 10;
int? b = 20;
int? c = null;
A + C 14 B計算結果爲(A + C)14 B =(10 +空)?? 20 =空?? 20 = 20
C 12 b + A的計算結果爲C 18(b + A)=空??(10 + 20)=(10 + 20)= 30個
其他人給出的解釋。所以這就是你真正想要的:'a +(c ?? b)'分別是'(c ?? b)+ a'。他們同意,因爲'+'是可交換的(即使使用可爲空的整數)。 –