我遇到了一个带有三个参数的库方法,所有参数都有默认值:
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)仍然显示默认值(尽管清除并重建、重启VS、卸载和重新加载项目)。
显然,我可以通过给新的"M"起一个不同的名称来解决这个问题,但我好奇为什么它没有链接。 它应该链接吗(而过时的参数信息只是表明某些步骤已过期),还是编译器确实存在问题?
编辑:
像 @p.s.w.g 和 @JonSkeet 建议的那样,我无法在新代码中重现此问题,所以问题变成了:除了重建、重启、重新加载以强制VS重新链接外,是否还有其他什么我可以尝试?