8

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

字符串 System.NullReferenceExceptionhttp://i.imgur.com/TBjpNTX.png

我创建了 var,检查是否为 null,如果是则返回,所以我无法将其视为 null :)

更清晰的错误?

编辑:
根据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是对的。唯一缺少的两件是:

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

2 回答 2

10

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

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

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

ReSharper 将停止抱怨。

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

最重要的是,如果您想使用自己的扩展方法,但要让 ReSharper 正确理解它,则必须对其应用以下 Contract Annotation:

[ContractAnnotation("null=>true")]
public static bool IsNullOrEmpty(this string input)
{
    ...
}
于 2014-05-01T09:00:13.830 回答
4

您的IsNullOrEmpty()-method 似乎是自己的发明,因为原始方法是静态方法System.String而不是扩展方法。ReSharper 无法弄清楚这一点,但如果您使用原始的,它会发现没有null-values 可以让它过去。

var str = value as string;

if (string.IsNullOrEmpty(str))
    return;

var unicorn = str.Contains("unicorn");
于 2014-05-01T09:01:54.143 回答