2014-02-24 44 views
0

最近,我创建了新的类,假设要包装我想要使用的每个方法,并在失败时重试使用。“无法解决方法 - 候选人” - 编译错误

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

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

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

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”方法将有不同的名称取决于它有多少个参数(也感觉它不是一个好的解决方案,并错过了过载的想法)。

您对我有其他想法吗?

+0

通常,最好不要将重载方法与默认参数混合使用。相反,如果你正在重载,添加更多的没有参数的重载,然后让他们用那个默认值调用相关的方法。我不知道这是你的问题,只是我发现的东西 –

+0

如何定义CacheManager.ExecuteSet? – poke

+0

public static bool ExecuteSet(string key,object value,ExpirationTimeEnum expirationTime = ExpirationTimeEnum.Never) – FelProNet

回答

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) { /* ... */ } 
    

    这不应该改变语义并让你相互配合ILE您最初的方法调用:

    Do(CacheManager.ExecuteSet, key, value,RetryProcess.RetryIntervals.TenMilliSeconds); 
    

有关默认参数更多的想法可以在Eric Lipperts blog找到。

相关问题