2014-10-30 40 views
3

考虑下面的程序产生标记为:CS1720警告错误地用于扩展方法

警告CS1720:由于'string'的默认值为空,Expression总是会导致System.NullReferenceException

我的问题是:为什么编译器会提示会出现NullReferenceException?Extension()的第一个电话相当于第二个,但第二个不会产生警告。这两个调用应该是安全的,因为this string str是一个参数,可以安全地为null,如第二行所示。我已经能够在3.5,4.0和4.5编译器上重现这一点,但不能使用Mono 3.0.7。

+2

这只是一个错误,[这里报道](https://connect.microsoft.com/VisualStudio/feedback/details/695362/c-compiler-gives-incorrect-warning-expression-will-always-cause-一个系统用的NullReferenceException换分机的方法)。当时他们并不急于修复它。 – 2014-10-30 21:18:41

+0

你可以添加一个'#pragma warning disable 1720'(有一个很好的评论来描述为什么)。 – clcto 2014-10-30 21:21:44

回答

1

在第一种情况下,您正在取消引用空对象,在第二种情况下,您正在调用带有空参数的方法。

== ==更新

让我重新状态,是的,这似乎并没有成为一个合法的警告。我怀疑编译器会发出警告,因为它认为解析空对象是“坏”的。该警告可能在扩展方法功能之前进行。

看到Roslyn如何分解它会很有趣。

+1

这两条线在功能上是相同的。 – clcto 2014-10-30 21:08:22

+0

是的,但我想象编译器仍然认为这是空对象的顺从。我猜罗斯林可能会提供更多信息。 – Dweeberly 2014-10-30 21:09:33

+0

对,就是这个问题。为什么编译器将其视为解引用? – clcto 2014-10-30 21:10:49

3

显然答案是肯定的,警告是不正确的。你已经证明了这一点。 (可能是因为它是所有警告的原因)

作为discussed earlier使用null值调用扩展方法并没有什么坏处。我想编译器团队并没有通过所有的麻烦来检查是否将该方法称为扩展方法。

+0

事实上,警告的执行可能早于扩展方法功能。 – 2014-10-30 21:28:43