Resharper:对标有" NotNull"的实体的可能空赋值。属性

时间:2016-03-15 09:30:58

标签: c# attributes refactoring resharper

如果这个问题有点痴迷我道歉但我确实喜欢我的代码,不要在resharper告诉我的地方有任何摆动的线条。

我有一个通用列表:

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

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

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

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

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

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

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

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

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

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

{{1}}

Resharper再次开始呻吟&#34;可能的空分配给标有&#34; NotNull&#34;的实体。属性&#34 ;.

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

1 个答案:

答案 0 :(得分:5)

我怀疑你可以使用R# annotation。类似的东西:

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

我相信给予R#足够的信息,以便在IsEmpty返回false时不会尝试使用空引用。