c# - 可选参数和方法重载

标签 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 的客户端将链接到具有两个参数的方法参数。

每次调用 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/

相关文章:

c# - Linq to XML - 字典转换

c# - 使用 var/null 奇怪的行为进行切换

C++11统一初始化和函数重载

c++ - 对非模板类型使用通用引用?

templates - 使用 `std::vector` 作为模板模板参数的默认值

C# 在项目中使用 SQlite 通过在用户计算机上使用不同的版本?

c++ - 重载时在定义之前声明函数模板

c++ - 在 C++ 中通过引用传递可选参数

c# - 带有可选参数的 Web 服务方法

c# - 玩家卡牌收集 MySQL