“无法解决方法 - 候选人是” - 编译错误

时间:2014-02-24 10:20:37

标签: c# .net generics

最近,我创建了一个新类,它假设要包装我想要使用的每个方法,如果失败则重试使用。

为了使这个功能适用于从一个参数到五个以上的各种方法,我创建了一些方法重载。

在某些情况下尝试使用此方法会给我编译错误: "无法解决方法 - 候选人是" 我希望得到一些关于如何处理它的建议。

所以,这是两个方法的例子:

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

我得到了上面提到的错误。

我想到的唯一解决方案是:

  • 使用每个调用中的所有参数而不使用默认参数(不喜欢它,因为我需要默认参数来使代码更清晰)。
  • 每个&#34;做&#34;方法将有不同的名称取决于它有多少参数(也觉得它不是一个好的解决方案,并错过了重载的想法)。

你对我有其他想法吗?

1 个答案:

答案 0 :(得分:0)

问题是

的签名
 public static bool ExecuteSet(string key, object value, ExpirationTimeEnum expirationTime = ExpirationTimeEnum.Never) { return true; }

仅与以下内容兼容:

TFunc<T, T1, T2, TResult>

因此,Do(...)的默认参数或其参数没有问题,但定义为ExecuteSet(...)

您有什么额外的可能性?

  1. 执行丑陋的解决方法

    Do((_, __) => ExecuteSet(_, __), key, value, RetryIntervals.TenMilliSeconds);
    
  2. 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);
    
  3. 有关默认参数的其他注意事项,请参阅Eric Lipperts blog