私は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
が発生する可能性がある場合は、
Anyを使用する場合は何も使用しません。単にFirstOrDefaultを実行し、結果がnullであることを確認してください。 – Steve
もし確信が持てば、単に「First」ではなく「OrDefault」を使うのはなぜですか?ツールは、すべてのコードパスとロジックを分析することはできません。 –
@IvanStoev - はい、代わりに 'First'を使うことができます。しかし、ReSharperが実際に私が見逃していたものを実際に知っているかどうかという疑問があります。コードに 'NullReferenceException'がありますか?あるいは、ツールはその程度までコードを分析しないだけですか? – smoksnes