可能的NullReferenceException ReSharper代码分析C#

时间:2017-11-07 16:55:43

标签: c# resharper

ReSharper代码分析告诉我在下面的代码片段中

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_id容器中是否存在这个特定的users吗?

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

2 个答案:

答案 0 :(得分:2)

如果您确定自己的收藏中有这样的元素,那么您可以使用.First

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

但是,最好使用.FirstOrDefault和null检查而不是Contains,这样您就不会两次查找集合:

var foundItem = users.FirstOrDefault(x => x.id == user_id);
if (foundItem != null)
{
    return foundItem.type == 2;
}

答案 1 :(得分:1)

  

这是真的,因为我已经检查user_id容器中是否存在这个特定的users吗?

是的,这是警告是正确的,因为users可能会在调用Contains和调用FirstOrDefault之间同时更改。 ReSharper的逻辑分析器不承担对容器的独占访问权限,因此发出警告是正确的行为。

您可以使用空条件运算符修复此警告:

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

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