私は、過負荷解決で奇妙な動作に気付きました。オーバーロード、ジェネリック型推論と 'params'キーワード
は、私は次のメソッドを持っていると仮定します。
public static void DoSomething<T>(IEnumerable<T> items)
{
// Whatever
// For debugging
Console.WriteLine("DoSomething<T>(IEnumerable<T> items)");
}
さて、私は、このオーバーロードを追加便宜上ように、この方法は、多くの場合、明示的な引数の数が少ないと呼ばれることを知っている:
public static void DoSomething<T>(params T[] items)
{
// Whatever
// For debugging
Console.WriteLine("DoSomething<T>(params T[] items)");
}
は今、私はこれらのメソッドを呼び出そう:
var items = new List<string> { "foo", "bar" };
DoSomething(items);
DoSomething("foo", "bar");
しかし、いずれの場合にも
、オーバーロードはparams
と呼ばれます。
List<T>
の場合には
IEnumerable<T>
というオーバーロードが呼び出されると予想していました。これは(少なくとも私にとっては)より良い一致と思われるからです。
この動作は正常ですか?それは誰でも説明できますか?私はMSDNのドキュメントでそれについての明確な情報を見つけることができませんでした...ここでは、過負荷の解決のルールは何ですか?
ありがとう、ジョンそれは私が必要とした正確な説明です。私が望むように動作させるための回避策はありますか?そうでない場合は別の名前を使用する必要があると思います... –
はい、ジェネリック型のパラメータを明示的に指定すると動作することに気付きました。しかし、私は型推論の利点を失う... –
わかりやすくするために、別の名前を使うことをお勧めします - あるいは、複数の項目でのみ使うつもりなら、 '(T first、params T [] others) ' –