在调用扩展方法之后,如何让resharper知道我的变量不为null?

时间:2017-06-20 16:42:44

标签: c# resharper

我有一个扩展方法:

public static bool Exists(this object toCheck)
{
   return toCheck != null;
}

如果我使用它然后做这样的事情:

if (duplicate.Exists())
    throw new Exception(duplicate);

然后resharper警告我可能存在空引用异常。

我知道这是不可能的,但我怎么能告诉resharper这没关系呢?

2 个答案:

答案 0 :(得分:4)

您可以使用合同注释来完成,但是另一个答案中提供的方式对我不起作用(即仍然会产生警告)。但是这个有效:

public static class Extensions {
    [ContractAnnotation("null => false; notnull => true")]
    public static bool Exists(this object toCheck) {
        return toCheck != null;
    }
}

获取ContractAnnotationAttribute - 推荐的方法是安装JetBrains.Annotations nuget包。如果您不想安装包 - 请转到Resharper>选项>代码注释并按“复制实现到剪贴板”按钮,然后将其粘贴到项目中的任何位置(确保不更改命名空间)。

答案 1 :(得分:3)

您可以使用"Contract Annotation Syntax"向Resharper表明方法在某些情况下无法正常返回,例如:当参数为null时。

对于您的示例,您可以执行以下操作:

[ContractAnnotation(toCheck:notnull => true]
public static bool Exists(this object toCheck)
{
   return toCheck != null;
}

toCheck:null => true告诉Resharper,如果toCheck不为null,则该方法将返回true

[编辑]更新链接以指向最新的Resharper文档。