![](/img/trans.png)
[英]ReSharper: Possible NullReferenceException with Enumerator?
[英]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;}
}
如果确定集合中包含此类元素,则可以使用.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;
}
考虑到我已经检查了该特定
user_id
是否在users
容器中,这是真的吗?
是的,这是警告是正确的,因为可能在对Contains
的调用与对FirstOrDefault
的调用之间同时更改users
。 ReSharper的逻辑分析器不假定对该容器具有独占访问权,因此发出警告是正确的行为。
您可以使用空条件运算符解决此警告:
var optType = users.FirstOrDefault(a => a.id == user_id)?.type;
if (optType.HasValue) {
return optType == 2;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.