可选参数和方法重载

吉尔斯

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

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不同的新名称来解决此问题,但是我很好奇为什么未链接。是应该这样做(还是有些不合时宜,如过时的参数信息所示),还是编译器对此有真正的疑问?

编辑

像@pswg和@JonSkeet的建议一样,我无法在新代码中重现此内容,所以我想问题就变成了:除了重新构建,重新启动,重新加载以强制VS重新链接之外,我还能尝试其他方法吗?

吉尔斯

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

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

当我实际添加[Obsolete](抱歉-我只是将其发布用于说明-认为不相关)时,我才发现“第三个M”,并收到有关覆盖已过时方法的警告。

我认为这可能支持@pswg的评论!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用out和可选参数进行方法重载

来自分类Dev

使用out和可选参数进行方法重载

来自分类Dev

使用可选参数的方法重载

来自分类Dev

无法简单重载时混合使用可选参数和参数

来自分类Dev

具有可选参数和其余参数的Typescript函数重载

来自分类Dev

F#可选参数和重载替代方案

来自分类Dev

方法重载值和参考参数类型

来自分类Dev

重载或可选参数之间的性能差异?

来自分类Dev

Typescript函数重载,通用可选参数

来自分类Dev

具有泛型方法和参数的重载方法

来自分类Dev

最终方法参数和非最终方法参数,在确定方法重载或重载时是否将它们视为不同的参数?

来自分类Dev

Guava可选作为可选参数的方法参数

来自分类Dev

Guava可选作为可选参数的方法参数

来自分类Dev

以Parent和Child类作为参数的方法重载

来自分类Dev

循环(可选)方法参数

来自分类Dev

设置可选的方法参数?

来自分类Dev

带有可选选项和&block参数的Ruby方法

来自分类Dev

方法,可选参数和/或接受多种数据类型

来自分类Dev

PHP-使用接口,策略模式和可选方法参数

来自分类Dev

如何在rust中使用参数重载或可选参数?

来自分类Dev

方法和方法重载

来自分类Dev

如何检查是否实现了可选的重载方法?

来自分类Dev

TypeScript和可选的解构参数

来自分类Dev

可选参数和条款 .where

来自分类Dev

方法重载和继承

来自分类Dev

子类和重载方法

来自分类Dev

可选参数:如果存在重载,则优先顺序颠倒

来自分类Dev

如何使用可选参数重载TypeScript中的函数?

来自分类Dev

使用第一个可选参数进行重载