Resharper警告空字符串(System.NullReferenceException)

时间:2014-05-01 08:52:09

标签: c# string nullreferenceexception resharper-8.0

只是想确定我没有编码太长时间......但是,这似乎不太可能:

string System.NullReferenceException http://i.imgur.com/TBjpNTX.png

我创建了var,检查是否为null,如果是则返回,所以我无法在那时看到它为null:)

Resharper bug?

修改
根据 Igal Tabachnik 回答,他是对的,我使用以下方法扩展程序:

public static bool IsNullOrEmpty(this string target)
{
    return String.IsNullOrEmpty(target);
}

我发现它更容易阅读

if (some_string.IsNullOrEmpty())
  // do something here 

而不是:

if (string.IsNullOrEmpty(some_string))
  // do something here 

解决方案:
Igal Tabachnik 是对的。唯一缺少的2件是:

  1. Resharper - >选项 - >代码注释(在代码检查组下) - >打开解决方案。
  2. 让VS花几分钟时间刷新一切。

2 个答案:

答案 0 :(得分:10)

您的代码表明您使用的IsNullOrEmpty()方法是您自己的自定义扩展方法。 “真实”IsNullOrEmptystring的静态方法。

简短回答:如果你把它改成

if (string.IsNullOrEmpty(input_string))
    return "...";

ReSharper将停止抱怨。

答案很长:由于这是您自己的扩展方法,因此ReSharper无法知道此方法的结果如何应用于您的代码。为此,ReSharper使用代码注释来计算有关代码的其他信息。一个这样的注释称为Contract Annotation,它是ReSharper用来计算原始string.IsNullOrEmpty()方法的结果的内容。您可以在博客文章中阅读更多相关信息。

最重要的是,如果您想使用自己的扩展方法,但让ReSharper正确理解它,您必须在其上应用以下合同注释:

[ContractAnnotation("null=>true")]
public static bool IsNullOrEmpty(this string input)
{
    ...
}

答案 1 :(得分:4)

您的IsNullOrEmpty() - 方法似乎是一项自己的发明,因为原始方法是System.String的静态方法,而不是扩展方法。 ReSharper无法找到那个,但是如果你使用原始的那个,它会看到没有null - 值可以让它过去。

var str = value as string;

if (string.IsNullOrEmpty(str))
    return;

var unicorn = str.Contains("unicorn");