次の2つの機能があるとします。
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
パラメータとして渡す場合、これらの 2 つはあいまいです。
オーバーロードを明確にするためにコンパイラにヒントを与える方法はありますか? 属性やディレクティブなどはありますか? この場合、最初の関数を呼び出したいと思います。何かのようなもの:
[InCaseOfAmbiguityUseThis]
public void Foo(IEnumerable<string> bar)
そのFoo(null)
ため、コンパイラはどこを探すべきかを知り、文句を言わないようにします。
私はしばらく探していましたが、敬意を払うものは何も見つかりませんでした。
PS:使用できることはわかっていますFoo((IEnumerable<string>)null)
が、それを避けようとしています:実際の関数の型は非常に長く、一般的な制約を使用しています(そのため、型を継承して短くすることはできません)。コードをたくさん。
ライブラリ (これらの関数を指定している場所) で「汚い」ことは気にしませんが、実際のビジネス コード (これらの関数を呼び出している場所) では気にしません。
また、これらのあいまいな関数がたくさんある可能性があるため、「それらをあいまいにしないための回避策」は問題外です (それは私が現在使用しているものですが、そのようなボイラープレート コードを持つのは好きではありません)。
編集
私は回避策を探しているわけではありません (つまり、別の関数を別の関数で作成する、またはパラメーターを使用しない)。私はこれらすべての方法を知っており、私が指定したように、私はすでにそれを使用しています。コンパイラに「自動的に」曖昧さを解消させることが実際に可能かどうか疑問に思っています。
私はパラメータのない関数を持たないことを好みます(実際の関数は、パラメータをまったく渡さないよりも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()
パラメーターなどがある場合は呼び出します)