可能的NullReferenceException ReSharper代码分析C#

Possible NullReferenceException ReSharper code analysis C#

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;}
}

如果你确定你的 collection 中有这样的元素,那么你可以使用 .First:

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

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

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

Is this true given that I already check whether this specific user_id exists in the users container?

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

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

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

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