2013-07-21 18 views
13

我剛讀出的SO post其解釋說FirstOrDefault()的返回類型將基於所述元素的值被選擇。帶Int和Int的FirstOrDefault行爲?

實施例:

ICollection<String> list = new List<String>(); 
list.Add("bye"); 

int a = (from x in list where (x == "hi") select x.Length).FirstOrDefault(); 

在這個例子中,a將等於0,因爲int默認值爲0。

然而,我可以追加.Cast<int?>()具體根據已經鏈接後,以查詢返回0結果時獲取null

int? a = (from x in list where ... x.Length).Cast<int?>().FirstOrDefault(); 

爲什麼我沒有得到一個編譯時錯誤(或至少是一個警告)時,我的第一個例子,我使用了一個可空INT(int?)而不是一個常規int

如果我理解正確的話,在null值執行我的第一個查詢將從未結果時使用int?

+2

你的問題不明確,給我。什麼確切的代碼編譯沒有警告你預期的錯誤/警告? 「int」的defalt值是「0」,而「int?」的defalt值是「null」是正確的。 –

+0

嗨@JeppeStigNielsen - 我很困惑,爲什麼編譯器,對於上面的''INT例如,將讓我用,即使'null'永遠不會返回空類型? 'dasblinkenlight'完全回答了我的問題。 –

回答

9

爲什麼我沒有得到一個編譯時錯誤(或至少是一個警告)時,我的第一個例子,我使用了一個可空int而不是常規int呢? 如果我理解正確,使用int?當執行我的第一個查詢時將永遠不會導致值爲null

你的理解是正確的。但是,編譯器不與你的願望,聲明變量a爲null的干擾,因爲它是一個「拉」的轉換:儘管從LINQ查詢分配永遠不會返回null,你可能有其他使用同一個變量下來如下:

int? a = (from x in list where (x == "hi") select x.Length).FirstOrDefault(); 
// Do something with `a`, which will not be null 
... 
a = null; 
if (someCondition) { 
    a = someNotNullValue(); 
} 
// Here, a may or may not be null 
... 
+0

[拋開]你不會反對在多個地方使用變量'a',因爲我記得Code Complete和經驗,增加變量的跨度可能會影響可讀性。 –

+3

@Kevin我將反對再使用一個變量,除非再次用於密切相關的第一宗旨之一。然而,編譯器不應該爲實施最佳實踐負責:他們必須服從程序員告訴他們做的事情,讓程序員擔心像他們自己的程序的可讀性那樣的「不重要」的事情。 – dasblinkenlight

+0

謝謝你的深思熟慮的話。 –