我遇到过一个包含三个参数的库方法,所有参数都具有默认值:
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
的客户端将链接到具有两个参数的方法参数。
每次调用 M
都可以解决,除了这个:
M(b2: false);
编译器报告“M(bool, bool)”和“M(bool, string, bool)”之间的调用不明确。
奇怪的是,在参数信息 (Ctrl+Shift+Space) 中,Visual Studio 仍然显示具有三个参数的方法的默认值(尽管清理和重建、重新启动 VS、卸载和重新加载项目)。
显然我可以通过调用新的 M
一些不同的东西来解决这个问题,但我很好奇为什么它没有链接。应该(并且有些东西不合时宜,正如过时的参数信息所暗示的那样),还是编译器对此有真正的问题?
编辑
就像@p.s.w.g 一样,按照@JonSkeet 的建议,我无法用新代码重现它,所以我想问题变成了:除了重建、重新启动、重新加载以强制 VS 重新链接它之外,还有什么我可以尝试的吗?
最佳答案
好吧,这在同等程度上是令人尴尬和有趣的(好吧 - 可能比有趣更令人尴尬)。
编译器是正确的(几乎总是如此!)。我曾假设编译器错误是指我在问题中概述的两个 M
方法,但有错误的客户端代码也用三个参数覆盖了原始的 M
,并且仍然为所有三个参数提供默认值。
当我实际添加 [Obsolete]
时,我才发现“第三个 M”(抱歉 - 我发布它只是为了说明 - 认为这无关紧要)并得到了关于覆盖过时方法的警告。
我认为这可能支持@p.s.w.g 的评论!
关于c# - 可选参数和方法重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24701732/