【问题标题】:"Cannot resolve method - candidates are" - compilation error“无法解析方法 - 候选者是” - 编译错误
【发布时间】:2014-02-24 10:20:37
【问题描述】:

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

为了使这个功能可用于从一个参数到五个甚至更多参数的各种方法,我创建了一些方法重载。

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

所以,这里是两种方法的示例:

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

我收到上面提到的错误。

到目前为止,我想到的唯一解决方案是:

  • 在每次调用中使用所有参数而不使用默认参数(不喜欢它,因为我需要默认参数来使代码更干净)。
  • 每个“Do”方法都会有不同的名称,具体取决于它有多少参数(也觉得这不是一个好的解决方案,错过了重载的想法)。

你对我有什么其他想法吗?

【问题讨论】:

  • 一般情况下,最好不要将重载方法与默认参数混合使用。相反,如果您正在重载,请添加更多不带参数的重载,然后让它们使用该默认值调用相关方法。我不知道这是否是你的问题,只是我发现的东西
  • CacheManager.ExecuteSet 是如何定义的?
  • public static bool ExecuteSet(string key, object value, ExpirationTimeEnum expirationTime = ExpirationTimeEnum.Never)

标签: c# .net generics


【解决方案1】:

问题是

的签名
 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);
    

关于默认参数的其他想法可以在Eric Lipperts blog找到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多