假设我有以下两个功能:
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/