1

三項演算子を使用して IEnumerable が null かどうかを判断している状況があり、期待どおりに動作していませんでした。

私がこれを行う場合:

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

.ToArray()次に、null チェックにもかかわらず発生したことを示す引数 null 例外 (「ソースを null にすることはできません」) を受け取ります。

これを(一見)同一のロジックに変更すると:

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

その後、エラーは消えます。私がいつも想像していたように、三項演算子は短絡しませんか?

EDIT質問ごとに:

はい、最初は子を設定していますが、2回目は設定していません:

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

そして、例外は .ToArray() 呼び出しで発生しています。私は取得しています

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

(メタデータから)

4

1 に答える 1

3

clickedItem.Children 1 つの違いは、2 番目の形式では式を1 回だけ評価することです。

Childrenプロパティが次のように実装されていると想像してください。

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

(または、もちろん、競合状態である可能性もあります。)

于 2012-07-25T15:59:20.313 に答える