gpt4 book ai didi

c# - 方法定义不明确,但希望保持向后兼容性

转载 作者:行者123 更新时间:2023-11-30 14:49:20 25 4
gpt4 key购买 nike

我有一个我想弃用的旧方法签名:

[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);

我想用一个更具前瞻性的变体来替换它,该变体使用参数参数来表示将来可能添加的各种选项:

public static T PollUntilReady<T>(
Func<T> functionThatMight503,
PollingOptions pollingOptions = null);

问题是如果没有指定选项,编译器会提示方法调用不明确。 (“以下方法之间的调用不明确...”)

有什么办法可以在不破坏向后兼容性、重命名新函数或损害新方法的灵 active ( optional 对象)的情况下解决这个问题?

最佳答案

您可以将其实现为两个函数:

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 的默认值现在被嵌入到您的代码中而不是调用代码中,这意味着如果您选择稍后更改默认值,旧代码将接收新的即使不重新编译也是默认的。


由于重载解析规则,这避免了歧义:

Otherwise if all parameters of MP have a corresponding argument whereas default arguments need to be substituted for at least one optional parameter in MQ then MP is better than MQ

来自 C# 语言规范的第 7.5.3.2 节。

关于c# - 方法定义不明确,但希望保持向后兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38998389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com