【问题标题】:Resharper: Possible null assignment to entity marked with "NotNull" attributeResharper:可能对标有“NotNull”属性的实体分配空值
【发布时间】:2016-03-15 09:30:57
【问题描述】:

如果这个问题有点令人着迷,我深表歉意,但我确实希望我的代码在 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 再次开始抱怨“可能对标有“NotNull”属性的实体进行空分配”。

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

【问题讨论】:

    标签: c# attributes refactoring resharper


    【解决方案1】:

    我怀疑您可以为此使用R# annotation。比如:

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

    我相信 应该 为 R# 提供足够的信息来确定如果 IsEmpty 返回 false,您不会尝试使用空引用。

    【讨论】:

    • 感谢 Jon,您的怀疑完全正确。我的代码下没有更多的摆动线,我很高兴。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 2012-02-09
    • 2022-01-02
    • 2017-09-01
    相关资源
    最近更新 更多