方法定义不明确,但要保持向后兼容性
本文关键字:兼容性 定义 不明确 方法 | 更新日期: 2023-09-27 18:02:42
我想弃用这个旧的方法签名:
[Obsolete("This method has been replaced with one that uses an arguments object")]
public static T PollUntilReady<T>(
Func<T> functionThatMight503,
double minPollInterval = 0d,
double maxPollInterval = double.MaxValue,
double maxPollTotalTime = double.MaxValue);
我想用一个更有前瞻性的变体来代替它,这个变体使用parameters参数来表示将来可能添加的各种选项:
public static T PollUntilReady<T>(
Func<T> functionThatMight503,
PollingOptions pollingOptions = null);
问题是如果没有指定选项,编译器会抱怨方法调用是不明确的。("调用在以下方法之间是二义性的…")
是否有任何方法可以解决这个问题,而不破坏向后兼容性,重命名新函数,或损害新方法的灵活性(可选选项对象)?
您可以将其实现为两个函数:
public static T PollUntilReady<T>(Func<T> functionThatMight503)
{
return PollUntilReady(functionThatMight503, null);
}
public static T PollUntilReady<T>(
Func<T> functionThatMight503,
PollingOptions pollingOptions)
{
throw new NotSupportedException(); //Whatever
}
当只带一个参数调用时,编译器现在可以解决歧义,因为它有一个不需要任何默认值的函数可供选择。
这意味着pollingOptions
的默认值现在被嵌入到您的代码中,而不是调用代码中,这意味着如果您选择稍后更改默认值,即使不重新编译,旧代码也将接收新的默认值。
由于重载解析规则,这避免了歧义:
否则,如果M p 的所有参数都有对应的实参,而默认实参需要替换MQ中的至少一个可选参数,则M p 优于MQ
来自c#语言规范第7.5.3.2节
我看到的唯一方法是必须消除方法定义不明确的可能性。而不是设置pollingOptions = null
默认情况下,你总是需要传递一些东西。
所以把你的方法签名改成:
public static T PollUntilReady<T>(
Func<T> functionThatMight503,
PollingOptions pollingOptions);
要使用新方法定义,必须传递pollingoptions或null。
在我看来,唯一的方法是即使你要求不牺牲可选参数