方法定义不明确,但要保持向后兼容性

本文关键字:兼容性 定义 不明确 方法 | 更新日期: 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。

在我看来,唯一的方法是即使你要求不牺牲可选参数