C#、Resharper、"Possible 'null' assignment to entity" 在不应该的时候发出警告

C#, Resharper, "Possible 'null' assignment to entity" warning when it shouldn't be

我有一个方法可以将 string.IsNullOrWhiteSpace(string value) 转换为扩展方法。

public static bool IsNullOrWhitespace(this string source)
{
  return string.IsNullOrWhiteSpace(source);
}

在我使用它检查 null 之后,Resharper 仍然警告我作为 [NotNull] 参数传递的变量可能为 null。

"Possible 'null' assignment to entity marked with 'NotNull' attribute"

如果我将我的使用 (str.IsNullOrWhiteSpace()) 替换为原来的 (string.IsNullOrWhiteSpace(str)),则不会显示警告。

Resharper 有没有一种方法可以训练它知道我的扩展方法是一个有效的空值检查器,这样这个空值赋值警告就不会出现?

注:

  1. 我不想用 //resharper disable comments everywhere 来隐藏它。
  2. 我不想完全禁用它,因为它应该在我不进行空值检查时显示。

编辑:

JetBrains.Annotations NuGet 包中有一个名为 ContractAnnotation 的 属性 可以解决这个问题。

[ContractAnnotation("source:null => true")]
public static bool IsNullOrWhitespace(this string source)
{
    return string.IsNullOrWhiteSpace(source);
}

这样就可以了。

因为你还能打电话

((string)null).IsNullOrWhiteSpace()

与Resharper有关。

重写代码如下:

(source == null) || string.IsNullOrWhiteSpace(source)

也许它会停止抱怨。

找到了!

JetBrains.Annotations NuGet 包中有一个名为 ContractAnnotation 的 属性 可以解决这个问题。

[ContractAnnotation("source:null => true")]
public static bool IsNullOrWhitespace(this string source)
{
    return string.IsNullOrWhiteSpace(source);
}

这样就可以了。

除非,如果你想删除警告(ReSharper v2016.2),它应该是 false 而不是答案中显示的 true

[ContractAnnotation("parameterName:null => false")]

而不是

[ContractAnnotation("parameterName:null => true")]