说我有以下两个功能:
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
)
答案 0 :(得分:3)
没有办法像这样自定义C#中的重载。选择方法过载有严格的规则。
但是,如果要提供方法的版本而不使用参数,则只需创建一个新的重载而不是传递null
:
void Foo()
{
Foo((string)null);
}
作为奖励,它会更具可读性。
此外,如果您无法修改原始类并且它们不提供您需要的重载,则可以使用扩展方法。这将使业务逻辑保持清洁。