可选参数和方法重载

时间:2014-07-11 15:50:48

标签: c# overloading optional-parameters

我遇到了一个包含三个参数的库方法,所有参数都是默认值:

virtual M(bool b1 = false, string s1 = null, bool b2 = true)

方法M不应该有参数s1,所以我想删除它,但我不想在DLL中进行重大更改。客户端显然可以忽略s1,但我不想将其保留在那里,因为M可以被覆盖而参数s1具有误导性。所以这是我的尝试:

virtual M(bool b1 = false, bool b2 = true)
[Obsolete] virtual M(bool b1, string s1, bool b2 = true)

我认为由于可选参数被编译到调用站点,现有客户端将继续使用三个参数调用该方法,而不使用s1的新客户端或重新编译的客户端将使用两个参数链接到该方法。 / p>

M的每次调用都可以解决,除了这一次:

M(b2: false);

编译器报告“M(bool,bool)”和“M(bool,string,bool)”之间的调用不明确。

奇怪的是,在参数信息(Ctrl + Shift + Space)中,Visual Studio仍在使用三个参数显示方法的默认值(尽管清理和重建,重新启动VS,卸载和重新加载项目)。

显然我可以通过调用新的M不同的东西来解决这个问题,但我很好奇为什么它没有链接。它应该(和某些东西一样不合时宜,因为过时的参数信息表明),或者编译器是否存在真正的问题?

修改

就像@pswg和@ JonSkeet的建议一样,我无法在新代码中重现这一点,所以我想问题就变成了:除了重建,重新启动,重新加载以迫使VS重新链接这个以外我还有什么可以尝试的?

1 个答案:

答案 0 :(得分:1)

嗯,这在同等程度上是令人尴尬和有趣的(好吧 - 也许比有趣的更令人尴尬)。

编译器是正确的(因为它几乎总是!)。我假设编译器错误是指我在问题中概述的两个M方法,但带有错误的客户端代码也覆盖了原始M三个参数,而仍然为所有三个参数提供默认值

当我实际添加[Obsolete]时,我才发现“第三个M”(对不起 - 我只是为了说明而发布了 - 不认为这是相关的)并且有一个关于覆盖过时的警告方法

我认为这可能支持@ p.s.w.g的评论!