我遇到了一个带有三个参数的库方法,所有参数都具有默认值:
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] 删除。
我来说两句