2016-02-02 48 views
-1

在VS2008中,似乎在三元運算中使用Find,FirstOrDefault和類似的方法存在很大問題。 考慮下面的非常簡單的例子:在VS2008中使用List方法的三元運算符問題

List<MyClass> myList = new List<MyClass>(); 
myList.Add(new MyClass() { SomeField = "Mr" }); 
myList.Add(new MyClass() { SomeField = "Mrs" }); 
myList.Add(new MyClass() { SomeField = "Ms" }); 

下不工作(或它是最好的說:這讓我空):

MyClass data = (myList != null) ? myList.Find(x => x.SomeField == "Ms") : null; 

如果我把myList.Find(X => x.SomeField ==「Ms」)在一個方法中調用該方法,而不是僅調用一次在操作中查找,我會得到一個非空值! 以上也將簡單的工種,如int,讓說:

int i = (1 < 2) ? 1 : 0; 

我的問題是:爲什麼?這裏使用List方法時發生了什麼?

(有一點需要注意:如果你使用零交換查找部分,其結果仍然是空的,所以問題不在於myList中!= NULL)

+0

無法重現。 –

+3

當我提供[mcve]時,我會很高興測試它。在那之前,我們可以做的事情並不多。 –

+0

將目標框架設置爲.NET 3.5(VS 2015)我可以使用提供的代碼重現此問題。它工作在更高版本。在.NET 3.5中使用.Where(...)。FirstOrDefault()確實可行。只是找不到(...)。奇怪的是,之前從未遇到過這個。 – Mark

回答

1

這似乎是一個問題調試器瞄準.NET 3.5(在VS 2015中測試)。調試器表示爲空,但在對變量執行某些操作後,調試器顯示預期值。當針對更高版本(經過測試的.NET 4.5.2)時,調試器已經在第一個斷點處顯示非空值。

.NET 3.5:

NULL in debugger at first breakpoint Not NULL in debugger at the second breakpoint

.NET 4.5.2:

enter image description here

+0

我認爲這是因爲「懶加載」。 – Daniel