鉴于以下代码,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);
}
答案 0 :(得分:3)
您可以使用ItemNotNullAttribute
告诉ReSharper,集合中的任何项目都不能null
。
答案 1 :(得分:1)
您所说的一种方法是使用[NotNull]属性来指示Resharper引擎停止检查该特定变量的空引用错误。
否则,如果您不想使用该属性,您可以选择使用评论
// ReSharper disable PossibleNullReferenceException
var bars = foos.Select(foo => foo.Bar);
// ReSharper restore PossibleNullReferenceException
为了指出这个问题,Resharper无法遍历语句的运行时计算值,因此它可以判断它不能为空。