模糊调用的默认重载

时间:2014-10-22 16:22:06

标签: c# ambiguous-call

说我有以下两个功能:

void Foo(IEnumerable<string> bar)
{
  if(bar == null)
    return;
  foreach(var b in bar)
  {
    Console.Write(b);
  }
}    

void Foo(string bar)
{
   Foo(new string[] { bar });
}

如果我将null作为参数传递,那么这两个是不明确的。

有没有办法提示编译器消除歧义的歧义?任何属性或指令或什么? 在这种情况下,我喜欢第一个被调用的函数。类似的东西:

[InCaseOfAmbiguityUseThis]
public void Foo(IEnumerable<string> bar)

因此,如果我Foo(null),编译器将知道在哪里寻找而不是抱怨。

我一直在寻找一段时间,并没有找到任何尊重的东西。

PS:我知道我可以使用:Foo((IEnumerable<string>)null)但这是我试图避免的:实际功能中的类型很长并且使用通用约束(因此我不能继承类型以使其更短),因此它会严重污染代码。

我不介意它在库(我指定这些功能)中&#39;脏&#39; 但在实际业务代码中没有#(其中)我正在调用这些功能。)

此外,可能存在许多这些可能含糊不清的功能,因此&#34;一种解决方法,不会使它们模糊不清&#34;是不可能的(这就是我现在使用的,但我不喜欢这样的样板代码)

修改

我没有寻找变通方法(即,使用不同或没有参数的其他功能)。我知道所有这些方式,正如我指定的那样,我已经在使用了。只是想知道它是否真的可以让编译器消除歧义&#34;自动&#34;。

我不希望没有无参数函数(真正的函数传递空参数比传递任何参数都要冗长得多):

Task<IEnumerable<TResult>> GetAsyncProjected<TResult>(
    IEnumerable<Expression<Func<T, bool>>> filters,
    Expression<Func<T, TResult>> projection,
    IEnumerable<string> eagerLoadRelationships,
    CancellationToken cancellationToken,
    ServiceRefreshMode refreshMode);

Task<IEnumerable<TResult>> GetAsyncProjected<TResult>(
    Expression<Func<T, bool>> filter,
    Expression<Func<T, TResult>> projection,
    IEnumerable<string> eagerLoadRelationships,
    CancellationToken cancellationToken,
    ServiceRefreshMode refreshMode);

// ... plenty of overloads for each possible parameter ...

对于没有filter / filters参数的每个重载,我确实有另一个重载但是我不希望调用者知道它已经通过{{1过滤器explcitly。

如果没有办法,那么我会寻找其他方法(如果它有参数或其他东西,则称之为null

1 个答案:

答案 0 :(得分:3)

没有办法像这样自定义C#中的重载。选择方法过载有严格的规则。

但是,如果要提供方法的版本而不使用参数,则只需创建一个新的重载而不是传递null

void Foo()
{
    Foo((string)null);
}

作为奖励,它会更具可读性。

此外,如果您无法修改原始类并且它们不提供您需要的重载,则可以使用扩展方法。这将使业务逻辑保持清洁。