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