Resharper:可能对标有 "NotNull" 属性的实体进行空分配

Resharper: Possible null assignment to entity marked with "NotNull" attribute

如果这个问题有点令人着迷,我深表歉意,但我确实希望我的代码在 resharper 告诉我的地方没有任何弯曲的线条。

我有一个通用列表:

var permissions = new List<Permission>();

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

if (permissions.First().ImportID == this.ImportId)
{
   // do stuff
}

Resharper(正确地)抱怨权限可能为空,所以我接受了它的建议并添加了一个签入:

if (permissions != null && permissions.First().ImportID == this.ImportId)
{
   // do stuff
}

现在我意识到我需要防止列表为空,所以我也添加了对其中任何一个的检查:

if (permissions != null && permissions.Any() && permissions.First().ImportID == this.ImportId)
{
    // do stuff
}

生活很美好,代码可以正常工作,resharper 很安静。意识到 null + any() 检查将被经常使用,我添加了一个扩展方法:

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

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

if (!permissions.IsEmpty() && permissions.First().ImportID == this.ImportId)

Resharper 又开始抱怨了 "Possible null assignment to entity marked with "NotNull“属性”。

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

我怀疑您可以为此使用 R# annotation。类似于:

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

我相信 应该 给 R# 足够的信息来计算出如果 IsEmpty returns [你不会尝试使用空引用=12=].