我如何告诉Resharper我的IEnumerable方法删除了空值?

时间:2014-10-24 22:28:19

标签: c# .net resharper static-analysis

鉴于以下代码,Resharper将正确警告我NullReferenceException上可能foo.Bar,因为可枚举中可能有null元素:

IEnumerable<Foo> foos = GetFoos();
var bars = foos.Select(foo => foo.Bar);

满足静态分析器的一种方法是明确排除空值:

IEnumerable<Foo> foos = GetFoos().Where(foo => foo != null);

我发现自己经常输入.Where(x => x != null),所以我用扩展方法将其包装起来,现在我可以执行以下操作:

IEnumerable<Foo> foos = GetFoos().NotNull();

问题是Resharper不知道NotNull()剥离了空值。有没有办法让Resharper教这个事实?一般来说,有没有办法告诉Resharper一个IEnumerable - 返回方法永远不会有空值(这样我就可以直接注释GetFoos())?

我知道我可以使用the NotNullAttribute告诉Resharper可枚举本身不是null,但我找不到可以说明可枚举的内容的那个。 / p>

修改:扩展方法看起来与您期望完全一样:

[NotNull]
public static IEnumerable<T> NotNull<T>(this IEnumerable<T> enumerable)
{   
    return enumerable.Where(x => x != null);
}

2 个答案:

答案 0 :(得分:3)

您可以使用ItemNotNullAttribute告诉ReSharper,集合中的任何项目都不能null

答案 1 :(得分:1)

您所说的一种方法是使用[NotNull]属性来指示Resharper引擎停止检查该特定变量的空引用错误。

否则,如果您不想使用该属性,您可以选择使用评论

// ReSharper disable PossibleNullReferenceException
        var bars = foos.Select(foo => foo.Bar);
// ReSharper restore PossibleNullReferenceException

为了指出这个问题,Resharper无法遍历语句的运行时计算值,因此它可以判断它不能为空。