c# - 不明确调用的默认重载

标签 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)但这就是我试图避免的:实际函数中的类型相当长并且使用泛型约束(所以我不能仅仅继承该类型以使其更短),因此它会严重污染代码。

我不介意它在库中(我在其中指定这些函数)“脏”,但不介意在实际业务代码(我在其中调用这些函数)上。

此外,可能有很多这些可能不明确的函数,因此“不使它们变得不明确的解决方法”是不可能的(这就是我现在正在使用的,但我不喜欢这样的样板代码)

编辑

我不是在寻找解决方法(即使用不同的参数或没有参数来创建其他函数)。我知道所有这些方法,并且正如我所指定的,我已经在使用它们。只是想知道是否真的可以让编译器“自动”消除歧义。

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

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参数,但我不希望这样做,以便调用者知道它正在传递 null明确用于过滤器。

如果没有办法,那我就寻找其他办法(如果有参数什么的就叫GetAsyncFilteredProjected())

最佳答案

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

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

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

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

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

关于c# - 不明确调用的默认重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26512266/

相关文章:

c# - 如何避免 NullReferenceException?

c++ - 有没有办法摆脱这种模糊性?

c# - 无法分配268435456字节的托管内存缓冲区。可用内存量可能不足

c# - 你能在 IF 语句中测试一系列值吗

c++ - 为什么私有(private)继承不能解决静态函数的歧义? (在 MSVC 中测试)

c++ - 这样的函数重载导致的歧义如何解决?

c++11 - 歧义运算符<<选择

c# - 避免歧义匹配异常

c# - 使用 System.WebClient 捕获 500 内部服务器错误

c# - 在 .NET 中使用 OpenSSL 加密和解密文件