繁体   English   中英

可能的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;}
}

如果确定集合中包含此类元素,则可以使用.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM