2012-07-25 146 views
1

我有一種情況,我正在使用三元運算符來確定IEnumerable是否爲null,並且它不像我所期望的那樣運行。爲什麼我會在'if'和linq之間看到不同的行爲?

如果我這樣做:

var children = clickedItem.Children != null ? clickedItem.Children.ToArray() : null; 

然後我收到的參數無效異常(「源不能爲空」),這表明.ToArray()儘管發生空校驗。

如果我改變了到(貌似)相同的邏輯:

var children = clickedItem.Children; 
if (children != null) children = children.ToArray(); 

則誤差消失。三元操作員是否像我一直想象的那樣不會短路?

編輯%的問題:

是的,我設置的孩子在第一時間,而不是第二:

public IEnumerable<AlbumOrTrack> Children 
{ 
    get 
    { 
     if (_children == null) 
     { 
      _children = _dataAccess.GetChildren(this); 
     } 
     return _children; 
    } 
} 

和異常在.ToArray)發生(電話。我越來越

// Exceptions: 
// System.ArgumentNullException: 
//  source is null. 

(從元數據)

+0

*如果*你得到的例外呢? – 2012-07-25 15:57:59

+0

你有'clickedItem.Children'的實現嗎? – Jodrell 2012-07-25 16:04:10

回答

3

一個不同之處是,在第二種形式你只計算表達式clickedItem.Children一次

試想一下,如果Children財產被作爲實施:

public IEnumerable<Child> Children 
{ 
    get 
    { 
     var ret = children; 
     // Mwahahaha! A getter with side-effects. They'll never expect that! 
     children = null; 
     return ret; 
    } 
} 

(或者它可能僅僅是一個競爭條件,當然)

+0

+1對於評論中的邪惡笑聲 – 2012-07-25 16:02:23

+0

......你說得對。照常。我確實有一個競爭條件,我需要使用克隆而不是將_children設置爲null。謝謝! – 2012-07-25 18:41:57

相關問題