如何告诉Resharper我的IEnumerable方法删除null

本文关键字:方法 删除 null IEnumerable 我的 何告诉 Resharper | 更新日期: 2023-09-27 18:27:42

给定以下代码,Resharper将正确地警告我foo.Bar上可能存在NullReferenceException,因为枚举对象中可能存在null元素:

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

满足静态分析器的一种方法是显式排除null:

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

我发现自己经常输入.Where(x => x != null),所以我把它封装在一个扩展方法中,现在我可以做以下操作:

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

问题是Resharper不知道NotNull()去掉了null。有什么方法可以教雷沙珀这个事实吗?一般来说,有没有一种方法可以告诉Resharper,IEnumerable返回的方法中永远不会有null(这样我就可以直接注释GetFoos()了)?

我知道我可以使用NotNullAttribute来告诉Resharper可枚举对象本身不是null,但我找不到一个能说明可枚举对象的内容的。

编辑:扩展方法与您预期的完全一样:

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

如何告诉Resharper我的IEnumerable方法删除null

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

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

或者,如果你不想使用该属性,你可以选择使用评论

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

为了说明这个问题,Resharper不能遍历语句的运行时计算值,所以它可以判断它不能为null。