Fir*_*ake 6 named-parameters c#-4.0
关于以下代码是否应该产生编译器警告的一个问题(它没有).它声明了两个相同名称/返回类型的方法,一个具有默认值的附加命名/可选参数.
注意:从技术上讲,分辨率并不含糊,因为规则明确规定第一种方法将被调用.请参见此处,重载分辨率,第三个要点.毫无疑问,这种行为对我来说也很直观.
public void Foo(int arg) { ... }
public void Foo(int arg, bool bar = true) { ...}
Foo(42); // shouldn't this give a compiler warning?
Run Code Online (Sandbox Code Playgroud)
我认为编译器警告在这里会很直观.虽然代码在技术上是干净的(无论是声音设计是一个不同的问题:)).
实际上,我不同意它需要警告。主要问题是,该代码是可能是合法的,如果是这种情况,您将必须显式禁用该警告。
我的意思是,一般来说,当您收到警告时,您将能够更改代码以消除警告(并且可能同时使代码变得更好)。但在这种情况下,您可能是故意这样做的,并且无法更改代码来消除警告。
例如,“无法访问的代码”警告是您可以删除无法访问的代码来消除警告。或者“找不到引用”警告 - 这通常是一个信号,表明您将收到“未定义类型”错误,但如果没有,那么您可以简单地删除引用。或者可能是“先前的 catch 子句已捕获所有异常”警告:在这种情况下,您需要更改代码,以便新子句出现在 catch-all 之前,或者完全删除 catch。
但要点是,在每种情况下,当您收到警告时,您都应该更改代码,并且进行更改总是会产生“更好”的代码。但是,在这个问题的情况下,调用并不含糊(就编译器而言),我认为您不能争论它总是的,因此不应该有一个警告。
如果编译器对您所做的事情可能不是最好的想法的每种情况发出警告,那么我们就会被警告淹没!