2010-08-13 50 views
6

據我所知,如果記錄集是空的,linq方法FirstOrDefault()返回null。爲什麼不能使用??運算符來對付這個函數?像這樣:FirstOrDefault()無法與? operator

Double d = new Double[]{}.FirstOrDefault() ?? 0.0; 


更新

我不想檢查,如果dnull在我後面的代碼上。而這樣做的:

Double d new Double[]{}.FirstOrDefault() == null 
     ? 0.0 
     : new Double[]{}.FirstOrDefault(); 

...或:

var r = new Double[]{}.FirstOrDefault(); 

Double d = r == null ? 0.0 : r; 

...似乎有點矯枉過正 - 我倒是喜歡做這個空支票的一行代碼。

+0

當你測試的時候,你可以用'default(double)'替換'new Double [] {}。FirstOrDefault();'。 – Kobi 2010-08-13 11:50:39

回答

10

其實,FirstOrDefault<T>()返回T,這是一個值或default(T)

default(T)爲值類型要麼null(T)0(如double

11

因爲空合併運算符(??)僅適用於可空引用類型,而Double是值類型。您可以使用可爲空的雙精度(double?)。

+6

即使這樣做,「?? 0.0」在這種情況下是多餘的。 – FuleSnabel 2010-08-13 11:45:26

+1

@FuleSnabel,絕對,因爲'0.0'是無論如何都是默認值。 – 2010-08-13 11:46:22

1

使它nullable應該工作。但是,那麼你使它nullable,一切都取決於你的場景......

Double d = new Double?[] { }.FirstOrDefault() ?? 0.0; 
5

的方法被稱爲FirstOrDefault不FirstOrNull,即,其將返回0,雙反正的默認值,所以沒有必要爲??。

+0

會接受你的答案。但詹姆斯庫倫提供了一個更詳細的。謝謝Ben。 – roosteronacid 2010-08-13 12:02:37

0

雖然其他人已經回答了你爲什麼在這裏遇到編譯問題,但你說得對,這對於值類型是有問題的。據我所知,在這種情況下無法知道零結果是因爲第一個項目是否爲零,或者因爲IEnumerable<double>是空的。

在你給的例子中,回退值爲零,無論如何,所以你需要的是:

var r = new double[]{...}.FirstOrDefault(); 

假設你有一個非零回退值,你有幾種選擇:

var r = !myDoubles.Any() ? fallback : myDoubles.First(); 

var r = myDoubles.Cast<double?>().FirstOrDefault() ?? fallback; 

如果你有Zen Linq Extensions,你可以這樣做:

var r = myDoubles.FirstOrFallback(fallback);