最近,我创建了一个新类,它假设要包装我想要使用的每个方法,如果失败则重试使用。
为了使这个功能适用于从一个参数到五个以上的各种方法,我创建了一些方法重载。
在某些情况下尝试使用此方法会给我编译错误: "无法解决方法 - 候选人是" 我希望得到一些关于如何处理它的建议。
所以,这是两个方法的例子:
public static TResult Do<T, TResult>(Func<T, TResult> action, T param,
RetryIntervals retryInterval, int retryIntervalMultiplier = 0, int retryCount = 3)
public static TResult Do<T, T2, TResult>(Func<T, T2, TResult> action, T param, T2 param2,
RetryIntervals retryInterval , int retryIntervalMultiplier = 0, int retryCount = 3)
如果我以这种方式使用这个新功能:
RetryProcess.Do(CacheManager.ExecuteSet, key, value,RetryProcess.RetryIntervals.TenMilliSeconds);
我得到了上面提到的错误。
我想到的唯一解决方案是:
你对我有其他想法吗?
答案 0 :(得分:0)
问题是
的签名 public static bool ExecuteSet(string key, object value, ExpirationTimeEnum expirationTime = ExpirationTimeEnum.Never) { return true; }
仅与以下内容兼容:
TFunc<T, T1, T2, TResult>
因此,Do(...)
的默认参数或其参数没有问题,但定义为ExecuteSet(...)
。
您有什么额外的可能性?
执行丑陋的解决方法:
Do((_, __) => ExecuteSet(_, __), key, value, RetryIntervals.TenMilliSeconds);
为ExecuteSet
方法添加另一个重载并删除默认参数:
public static bool ExecuteSet(string key, object value) {
return ExecuteSet(key, value, ExpirationTimeEnum.Never);
}
public static bool ExecuteSet(string key, object value, ExpirationTimeEnum expirationTime) { /* ... */ }
这不应该改变语义,并允许你编译初始方法调用:
Do(CacheManager.ExecuteSet, key, value,RetryProcess.RetryIntervals.TenMilliSeconds);
有关默认参数的其他注意事项,请参阅Eric Lipperts blog。