2017-11-07 17 views
0

ReSharperのコード解析は、次のコードスニペット可能とNullReferenceException ReSharperのコード分析C#

if (users.Select(a => a.id).Contains(user_id)) 
{ 
    return users.FirstOrDefault(a => a.id == user_id).type == 2; 
} 

にラインreturn users.FirstOrDefault(a => a.id == user_id).typeが可能System.NullReferenceExceptionにつながるかもしれないと言われます。この特定のuser_idusersコンテナに存在するかどうかを既に確認しているので、これは本当ですか?あなたがあなたのコレクションにそのような要素を持っていることが確実な場合

class users 
{ 
    int id {get; set;} 
    int other_stuff {get; set;} 
} 

答えて

1

は私がalreadことを考えると、この本当ですy具体的なuser_idusersコンテナに存在するかどうかを確認しますか?

はい、これはusersContainsへの呼び出しとFirstOrDefaultへの呼び出しの間に同時に変更することができるので、警告は、正確です。 ReSharperのロジックアナライザはコンテナへの排他的アクセスを想定していないため、警告を発行するのが正しい動作です。

あなたはヌル・条件演算子でこの警告を修正することができます。

var optType = users.FirstOrDefault(a => a.id == user_id)?.type; 

if (optType.HasValue) { 
    return optType == 2; 
} 
2

次に、あなただけの.First使用することができます。

if (users.Select(a => a.id).Contains(user_id)) 
{ 
    return users.First(a => a.id == user_id).type == 2; 
} 

しかし、そうあなたそのContainsの代わりに.FirstOrDefaultとヌルチェックを使用することをお勧めします二回あなたのコレクションを検索しません:

var foundItem = users.FirstOrDefault(x => x.id == user_id); 
if (foundItem != null) 
{ 
    return foundItem.type == 2; 
} 
関連する問題