3
私は次のメソッドがあります。このC#メソッドのオーバーロードが期待どおりに機能しないのはなぜですか?
私は次のように実行public void Say<TItem>(TItem item)
{
Console.WriteLine("A");
}
public void Say<TItem>(IEnumerable<TItem> items)
{
Console.WriteLine("B");
}
:
void Main()
{
Say<string>("Foo");
Say(new string[] { "Foo", "Bar"});
}
第1の方法は二回呼び出されます。
A
A
IEnumerable<T>
TItem[]
に変更注意し期待どおりに動作しますが、IEnumerable<T>
の場合、2番目の方法を選択しないのはなぜですか?意図したオーバーロードをどのように達成できますか?
偉大ですが、なぜパラメータ型が 'IEnumerable'ではなく 'string []'であれば、この特別なヘルプは不要ですか? –
MaYaN
@MaYaNどちらの場合も、両方のシグネチャに一致する可能性があります。メソッドが 'IEnumerable'を取るとき、暗黙のキャストがマッチする必要があります。他のメソッドの場合、そのようなキャストは必要ありません。コンプライアーの考えでは、これにより、最初のオーバーロードがより緊密に一致します。より具体的になると、コンパイラはあなたがしようとしていたことをより深く推測することができます。 – pquest