【发布时间】:2016-10-29 17:12:57
【问题描述】:
我正在开发一个 c# 库,因此我们担心破坏向后兼容性,但我想知道是否可以仅更改参数的名称并保持向后兼容性,因为能够使用命名参数?下面是我正在尝试做的一个示例
[Obsolete("use ChangeSpecificFoo(SpecificFoo specificFoo)")]
public void ChangeSpecificFoo(SpecificFoo foo)
{
_specificFoo = foo;
}
//Compile error ... already defines a member called 'ChangeSpecificFoo' with the same parameter types
public void ChangeSpecificFoo(SpecificFoo specificFoo)
{
_specificFoo = specificFoo;
}
仅更改参数名称存在破坏向后兼容性的潜在风险,因为有人可能会使用诸如 ChangeSpecificFoo(foo: someSpecificFoo) 之类的命名参数调用该方法,但我们不能通过添加具有正确参数名称的新方法来弃用该方法,因为参数名称不包含在方法签名中,因此编译器将其视为重复。
有没有办法解决这个问题?我看到的唯一替代方法是更改方法名称,使其不重复,然后弃用旧方法,或者等到我们从参数列表中添加或删除参数并更改参数名称(这可能永远不会发生,因为方法是非常稳定),或者只是进行更改并修复我们在使用此库的代码中可能遇到的任何中断。
【问题讨论】:
-
从功能上讲,这两种方法完全相同。将其中任何一个放在您的代码中都没有区别
-
@JonSkeet 我明白你在说什么,但现在我想知道为什么会这样?这似乎是一种愚蠢的做法......
-
@Andrew:在有多个相同类型的参数的情况下,可读性得到了巨大的改进......并且可选参数的有用性大大增加,如它允许指定任何可选参数。
-
我将添加/更新 XML 注释块以澄清
-
@Andrew 人们为了更改名称而更改参数名称是一个非常小的问题。这在真实场景中确实不会发生,尤其是当您不拥有将调用您的方法的所有代码时。与往常一样,Jon Skeet 列举了很多(可能)极少数情况下您会选择使用命名参数的示例。
标签: c# backwards-compatibility named-parameters