6

关于以下代码是否应该产生编译器警告的一个问题(它不会)。它声明了两个具有相同名称/返回类型的方法,一个具有附加的命名/可选参数,具有默认值。

注意:从技术上讲,该解决方案并不模棱两可,因为规则明确规定将调用第一个方法。请参见此处,过载分辨率,第三个要点。毫无疑问,这种行为对我来说也是直观的。

public void Foo(int arg) { ... }

public void Foo(int arg, bool bar = true) { ...} 

Foo(42); // shouldn't this give a compiler warning?

我认为编译器警告在这里会很直观。虽然代码在技术上是干净的(它是否是一个声音设计是一个不同的问题:))。

4

2 回答 2

1

实际上,我不同意它需要警告。主要问题是,该代码可能是合法的,如果是这种情况,您将不得不明确禁用警告。

我的意思是,一般来说,当您收到警告时,您将能够更改代码以消除警告(并且可能同时使代码变得更好)。但在这种情况下,可能是您故意这样做,并且无法更改代码以消除警告。

例如,“无法访问的代码”警告是您可以删除无法访问的代码以摆脱警告的内容。或者“找不到引用”警告 - 这通常是一个信号,表明您将收到“未定义类型”错误,但如果没有,那么您可以简单地删除引用。或者可能是“前一个 catch 子句已经捕获了所有异常”警告:在这种情况下,您需要更改代码,以便新子句位于 catch-all 之前,或者完全删除 catch。

但关键是,在任何情况下,当您收到警告时,您都应该更改您的代码,并且进行更改总是会产生“更好”的代码。但是,在这个问题的情况下,调用并不模棱两可(就编译器而言),我认为您不能争辩说编写这样的代码总是错误的,因此不应该一个警告。

如果编译器对一种你做一些可能不是最好的主意的情况都发出警告,那么我们就会被警告淹没!

于 2010-04-19T21:21:07.903 回答
1

警告是为了通知程序员潜在的愚蠢错误。这是一个可能产生愚蠢错误的区域,所以是的,它应该产生警告。你想形成请愿书吗?

于 2010-04-19T21:06:17.420 回答