如何告诉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);
}
您可以使用ItemNotNullAttribute
,它告诉ReSharper集合中的任何项都不能是null
。
正如您所说的一种方法是使用[NotNull]属性,该属性指示Resharper引擎停止检查该特定变量的null引用错误。
或者,如果你不想使用该属性,你可以选择使用评论
// ReSharper disable PossibleNullReferenceException
var bars = foos.Select(foo => foo.Bar);
// ReSharper restore PossibleNullReferenceException
为了说明这个问题,Resharper不能遍历语句的运行时计算值,所以它可以判断它不能为null。