Resharper:可能为标记为"NotNull"属性的实体赋值

Lob*_*nts 1 c# resharper refactoring attributes

如果这个问题有点痴迷,我很抱歉,但我确实喜欢我的代码,不要在resharper告诉我的地方下面留下任何扭曲的线条.

我有一个通用列表:

var permissions = new List<Permission>();
Run Code Online (Sandbox Code Playgroud)

在代码中的某些点我需要测试第一个元素:

if (permissions.First().ImportID == this.ImportId)
{
   // do stuff
}
Run Code Online (Sandbox Code Playgroud)

Resharper(正确地)抱怨权限可能为null,因此我接受其建议并添加一个签入:

if (permissions != null && permissions.First().ImportID == this.ImportId)
{
   // do stuff
}
Run Code Online (Sandbox Code Playgroud)

现在我意识到我需要防止列表为空,所以我也在那里添加一个支票:

if (permissions != null && permissions.Any() && permissions.First().ImportID == this.ImportId)
{
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

生活是美好的,代码工作和resharper是安静的.意识到我将经常使用null + any()检查,我添加了一个扩展方法:

public static bool IsEmpty<T>(this IEnumerable<T> source)
{
    if (source == null)
        return true; 
    return !source.Any();
}
Run Code Online (Sandbox Code Playgroud)

现在唯一的问题就是我使用它:

if (!permissions.IsEmpty() && permissions.First().ImportID == this.ImportId)
Run Code Online (Sandbox Code Playgroud)

Resharper再次开始呻吟"可能对指定为"NotNull"属性的实体赋值.

那么,有没有办法让resharper知道在执行IsEmpty()之后权限永远不会为空(以同样的方式理解!= null)或者是忽略该消息的唯一选择.

Jon*_*eet 5

我怀疑你可以使用R#注释.就像是:

[ContractAnnotation("null => true")]
public static bool IsEmpty<T>(this IEnumerable<T> source)
{
    return source == null || !source.Any();
}
Run Code Online (Sandbox Code Playgroud)

我相信应该给R#足够的信息,以确定如果IsEmpty返回你不会尝试使用空引用false.