2016-12-02 9 views
2

私はReSharper Ultimate 2016.2を使用していますが、以前のバージョンでもこれを見てきました。 ReSharperは私にと言う警告を与えるでしょう の後に私がFirstOrDefaultを使うとき、 'System.NullReferenceException'が可能です。以下の例:ReSharper - Anyの後の 'System.NullReferenceException'の可能性あり

Foo[] items = GetItems(); 
var myName = "MyName"; 
if (items.Any(x => x.Name == myName)) 
{ 
    var item = items.FirstOrDefault(x => x.Name == myName); 
    var name = item.Name; // Possible 'System.NullReferenceException' 
} 

警告が正しいか、上記のコードは安全ですか?

警告を無効にすることができますが、それは重要なことではありません。 NullReferenceExceptionが発生する可能性がないことを確認したい。私が最初にAnyとチェックしてから、FirstOrDefaultは1つのアイテムを返すべきです。または私は何かを逃していますか?

上記のコードは、単にMCVEです。

UPDATE:コメント欄で述べたように

、コードが最適化された(及び簡略化)することができます。問題はコード内の問題を解決する方法ではありません。しかし、ReSharperの状態で実際にNullReferenceExceptionが発生する可能性がある場合は、

+0

Anyを使用する場合は何も使用しません。単にFirstOrDefaultを実行し、結果がnullであることを確認してください。 – Steve

+0

もし確信が持てば、単に「First」ではなく「OrDefault」を使うのはなぜですか?ツールは、すべてのコードパスとロジックを分析することはできません。 –

+0

@IvanStoev - はい、代わりに 'First'を使うことができます。しかし、ReSharperが実際に私が見逃していたものを実際に知っているかどうかという疑問があります。コードに 'NullReferenceException'がありますか?あるいは、ツールはその程度までコードを分析しないだけですか? – smoksnes

答えて

1

への呼び出しに置き換える必要があります。これは常に論理的に真である、あなたの変数があればブロック内で割り当てられていることを確信している割り当てられていない変数のコンパイラ使用により放出されたエラーのような。簡単に言えば。

void Main() 
{ 

    int a; 
    Environment.CurrentDirectory = "C:\\temp"; 
    if(Environment.CurrentDirectory == "C:\\temp") 
     a = 1; 
    // Error - Use of unassigned variable 
    Console.WriteLine(a); 
} 

ここでは、実行時に、あなたの変数の状態、人間の脳はできるがどうなるか、コンパイル時に静的アナライザは、知っておくべき(またはより良いを理解する)ので、このレベルにあなたのコードを解析しようとするのは不可能です変数を代入しない方法がないことを確認してください(同じプロパティを混乱させる他のスレッドはありませんが、プロパティの動作についての参照元を確認しました)が、コンパイラはこのコードの意味を同じ深さで分析する必要がありますこの時点では、私たちはそれを持っていません。 Resharperにも同じルールが適用され、必要なものはありませんインテリジェンス必要なものすべてを行う(現在)

+1

うん。また、プロパティーゲッターがプロパティーセッターに渡されたのと同じ値を返すという保証はありません。それがフィールドであっても、コール間で別のスレッドによって変更されないという保証はありません。 –

+0

ありがとう。それは私が疑った通りでしたが、私は何かを逃してしまったのではないかと心配しました。 – smoksnes

3

FirstOrDefaultのためです。条件が一致しない場合は、クラスに対してNULLを返します。 ReSharperは現時点ではAnyを考慮していません。

あなたはFirst

+0

これは正解です。 'FirstOrDefault'だけが重要です。このメソッドは 'CanBeNull'アノテーションを持っています。これは' item'が 'null'と考えられる理由です。 – Matthias

関連する問題