关于以下代码是否应该产生编译器警告(它没有)的一个问题。它声明了两个具有相同名称/返回类型的方法,一个具有默认值的附加命名/可选参数。
注意:从技术上讲,解决方案并不含糊,因为规则明确规定第一种方法将被调用。见here, Overload resolution, third bullet point。毫无疑问,这种行为对我来说也很直观。
public void Foo(int arg) { ... }
public void Foo(int arg, bool bar = true) { ...}
Foo(42); // shouldn't this give a compiler warning?
我认为编译器警告在这里会很直观。虽然代码在技术上是干净的(无论是声音设计是一个不同的问题:)。)。
答案 0 :(得分:1)
警告是通知程序员可能出现的愚蠢错误。这是一个可能产生愚蠢错误的区域,所以是的,它应该产生一个警告。你想写一份请愿书吗?
答案 1 :(得分:1)
我不同意它确实需要警告。主要问题是,该代码可能合法,如果是这种情况,则必须明确禁用该警告。
我的意思是,一般来说,当您收到警告时,您将能够更改代码以消除警告(并且可能会使代码同时变得更好)。但在这种情况下,可能是你故意这样做,并且无法改变你的代码以消除警告。
例如,“无法访问代码”警告是您可以删除无法访问的代码以消除警告。或者“无法找到引用”警告 - 这通常是一个信号,您将获得“未定义类型”错误,但如果没有,那么您可以简单地删除引用。或者“先前的catch子句已捕获所有异常”警告:在这种情况下,您需要更改代码,以便新子句在catch-all之前,或者完全删除catch。
但重点是,在每次收到警告时,应该更改您的代码,并且进行更改将始终产生“更好”的代码。但是,在这个问题的情况下,调用不是模糊的(就编译器而言)并且我认为你不能认为编写这样的代码是总是错误,所以不应该有警告。
如果编译器发出关于每个情况的警告,你做了一些可能不是最好的想法,那么我们就会被警告淹没!