2014-01-10 36 views
3

我讀this question,我發現Tim Schmelter's answer差異的if-else:

順便說一句,這就是條件運算符和的if-else之間的區別之一

你可以檢查這個問題的答案,我找不到原因?

如果條件運算工作像的if-else爲什麼如果別人不需要投

問題:

int? l = lc.HasValue ? (int)lc.Value : null; 

「蒂姆Schmelter」 的答案:

你有以鑄造null以及:

int? l = lc.HasValue ? (int)lc.Value : (int?)null; 

順便說一句,這是的conditional operator之間的區別之一和if-else

if (lc.HasValue) 
    l = (int)lc.Value; 
else 
    l = null; // works 
+0

@Akrem它清楚地說明你不需要在if-else中投入NULL,但它必須在條件運算符 –

+0

中完成。我相信如果你在這裏添加原始問題/答案的某些部分,它會更清晰。 –

回答

5

單獨的文字null沒有類型,但它可以隱式轉換爲任何參考類型和任何類型的。在該表達式中:

x = null 

其中x被分配爲null時,編譯器可以很容易地從x什麼null文字應被轉換成可變(或字段或屬性或參數或其他)的類型推斷。例如,如果是xstring型時,null應代表null參考,而如果是xint?型時,應null其中HasValue是假代表的Nullable<int>一個實例。

如果x的類型爲int,則不存在隱式轉換,且上述表達式不能編譯。

(聲明var x = null;var是不是因爲null法律沒有類型本身。)

在另一方面,在表達:

someBoolean ? 42 : null /* illegal */ 

編譯器無法弄清楚什麼類型轉換成null。請記住,int既不是引用類型,也不是Nullable<>類型。

如果你的意思是包裝成空,用途:

someBoolean ? (int?)42 : null 

或:

someBoolean ? 42 : (int?)null 

在這兩種情況下,編譯器會自動看到其他操作數(在另一側冒號:)也必須隱式轉換爲int?

如果你的意思是拳擊到一些基類或接口int,寫:

someBoolean ? (object)42 : null 

或:

someBoolean ? 42 : (object)null 

現在,上面的表述可能是子表達式中包含更大的表達式,但編譯器仍然需要表達式的類型以清除i自行宣佈。例如,在:

int? x; 
x = someBoolean ? 42 : null; // still illegal! 

即使子表達someBoolean ? 42 : null出現較大的表達x = someBoolean ? 42 : null其中x確實有一個內部類型,子表達式必須仍然獲得它的類型「本質」。 x的類型不能「泄漏」到子表達式上。對於許多新的C#開發人員來說,這個「語法」似乎是一個驚喜。像你這樣的問題經常被看到,例如見Nullable type issue with ?: Conditional Operator和鏈接到它的線程。

1

if語句不產生價值,所以在「然後」和「其他」部分別語句不需要以任何方式兼容類型。

條件運算符產生一個值,因此兩個部分必須以某種方式類型兼容,以便編譯器確定表達式的類型。

0

MSDN說用於條件算子:

*要麼first_expression和second_expression的類型必須是相同的,或隱式轉換必須存在從一種類型到另*

就是這個原因。 。在if-else構造函數中,其他塊中的代碼與中的代碼無關,因爲如果塊被阻止,則編譯器在每種情況下都可以推斷出類型轉換。

+0

規範的問題是它沒有考慮賦值的類型。我們不必將結果分配給任何東西,但這不是典型的用例。無論如何,當你不分配結果時,類型並不重要。在典型的用例中,我認爲我們並不在意表達式是否相互兼容。只有其中一個將被評估,唯一兼容的興趣類型是分配的類型。那麼'int? x = b? 42:null'應該是完全合法的。那麼應該對象x = b? 42:null'。 –