オーバーロードの解決に関する奇妙な動作に気付きました。
次のメソッドがあるとします。
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");
ただし、どちらの場合も、with のオーバーロードparams
が呼び出されます。IEnumerable<T>
a の場合はオーバーロードが呼び出されることを期待していたでしょうList<T>
(少なくとも私には)。
この動作は正常ですか? 誰でも説明できますか?MSDNドキュメントでそれに関する明確な情報を見つけることができませんでした...ここに含まれるオーバーロード解決ルールは何ですか?