【发布时间】:2011-02-09 02:50:15
【问题描述】:
关于以下代码是否应该产生编译器警告的一个问题(它不会)。它声明了两个具有相同名称/返回类型的方法,一个具有附加的带默认值的命名/可选参数。
注意:从技术上讲,该解决方案并不含糊,因为规则明确规定将调用第一个方法。见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?
我认为编译器警告在这里会很直观。虽然代码在技术上是干净的(它是否是一个合理的设计是一个不同的问题:))。
【问题讨论】:
-
为什么第二种方法有默认参数?正如您的链接所述,如果您调用 Foo(42) 它应该调用第一个方法,因此您的第二个带有默认参数的方法将永远不会被选择...?
-
问题不在于我用这两种方法设计了一个类。问题是不完美的世界,当第一个方法已经存在(我可能不知道)时,我将第二个方法添加到类中,添加调用,可能会错过(慢)智能感知,并想知道为什么新的没有得到叫。不是一个大问题,但仍然是一个潜在的问题。对我来说,它已经足够接近模棱两可了。如果你告诉我你从来没有意外地实现过两次,那么你就从来没有在一个复杂的项目中编写过代码。
-
@oedo,这里的问题不是关于默认参数,而是为什么编译器在这种情况下不发出警告。问题是开发者可能不知道这个规则。
-
啊,我明白了,对不起。是的,在这种情况下,我同意你的看法,警告会让校长不感到意外。
-
打电话给 Eric Lippert ... (stackoverflow.com/users/88656/eric-lippert)