我有一个非常简单的片段代码,其中包含一个foreach循环:
foreach(var item in list) {
var valueForPropertyA = getPropertyAValue(item?.Id ?? 0);
if(valueForPropertyA == null) {
continue;
}
item.PropertyA = new PropertyADto(valueForPropertyA);
}
我们还有一些自动代码检查工具,它在上面的代码中给出了以下警告:
'item' is null on at least one execution path
item
中的list
null
是string1='hi'
string2='I'
string3='am new to this'
还是错误解释警告?
答案 0 :(得分:5)
当然,foreach
不会跳过null
的项目。然后,您会在第NullReferenceException
行获得item.PropertyA = new PropertyADto(valueForPropertyA);
。
相反,你可以使用
foreach(var item in list.Where(i => i != null))
{
// ...
}
答案 1 :(得分:2)
引用项和nullable
值类型可以为null - 但您可以手动跳过它们
foreach(var item in list.Where(x => x != null))
答案 2 :(得分:2)
要回答您的主要问题,是的,如果IEnumerable
循环枚举的foreach
包含引用类型,则它们可以为null。例如,List<string>
可能包含空条目,因为string
可以为空。
我怀疑您收到'item' is null on at least one execution path
消息的原因是由于在以下行使用了null传播运算符:
var valueForPropertyA = getPropertyAValue(item?.Id ?? 0);
稍后你打电话:
item.PropertyA = new PropertyADto(valueForPropertyA);
第一行的item?.Id
表示您希望item
可能为空。第二行不包括空传播运算符,因此代码分析工具警告您,虽然item
在第一行可能为空,但您不会在第二行处理此可能性。