foreach中的项可以为null

时间:2018-05-17 10:08:14

标签: c#

我有一个非常简单的片段代码,其中包含一个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 nullstring1='hi' string2='I' string3='am new to this' 还是错误解释警告?

3 个答案:

答案 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在第一行可能为空,但您不会在第二行处理此可能性。