2012-09-17 41 views
1

在C#(空類型)輸出(在C#空類型)

int a = 10; 
int? b = 20; 
int? c = null; 

System.Console.WriteLine(a+c??b); 

輸出是:20

如果(C 12 B + A),則輸出是30

我不不明白爲什麼..

+0

其他人給出的解釋。所以這就是你真正想要的:'a +(c ?? b)'分別是'(c ?? b)+ a'。他們同意,因爲'+'是可交換的(即使使用可爲空的整數)。 –

回答

0

由於c爲空,所以答案是b!這是你的雙倍?做。

+0

a +正在做什麼?沒有效果 ? – Vikash

+0

更類似於:「由於**'a + c' **爲空,所以答案是'b'!」 –

1

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

+0

這不就是原始海報的想法嗎?如果'''真的更強,他**可以**改變加數的順序。 –

+0

@JeppeStigNielsen這是一個錯字,現在糾正 –

+0

現在,它是混亂。 'c? b + a'更像:'c == null? (b + a):c' –

1

當你寫:

System.Console.WriteLine(a+c??b); 

這將有效地評價:

 int? temp = a + c; 
     System.Console.WriteLine(temp ?? b); 

「溫度」 上面是空,所以你得到的b結果。

0

運算符??用於檢查空值。它會返回有問題的值,或者返回空值。

c ?? b表示「c,除非c爲空,在這種情況下b」。

c ?? b + a檢查c,看到它爲空,並使用b(20)代替。然後它增加了一個(10)得到30. *

a + c ?? b似乎應用??a + c而不是僅僅對c,導致整個事情被替換爲b(20)。

*不確定在這種情況下的操作順序,可能由於c爲空而使用(b + a)。

+1

另外,爲了正確,「'c ?? b + a'檢查'c',並且看到它是空的,並且使用**'b + a' **來代替。因此它評估'b + a'。 –

2

這只是一個優先問題。

此:

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.

+0

有什麼問題。 'a + c' **是** null。 –

+0

@JeppeStigNielsen:抱歉,布魯諾。現在修復。 –

1

檢查這裏: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個

+0

一個很好的答案。但最好把最後一行寫成:'c ?? b + a'評估爲'c ??(b + a)= null ??(10 + 20)=(10 + 20)= 30'。如果'c'不是null,則添加永遠不會執行。但這與你絕對正確解釋的優先順序不同。 –

+0

謝謝@Jeppe Stig Nielsen,糾正了它。 – prashanth

+1

值得一讀:http://stackoverflow.com/questions/6238074/how-the-right-associative-of-null-coalescing-operator-behaves – prashanth