2016-08-31 7 views
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番目の方法を選択しないのはなぜですか?意図したオーバーロードをどのように達成できますか?

答えて

6

TItemstring[].だと思うので、これをコンパイラの観点から見てください。それは、そのメソッドにプラグインするジェネリック型を探していることです。文字列[]が型です。

Say<string>(new string[]{"Foo", "Bar"}); 

が、それはあなたが実際に望んでいた方法を選択するために取得するのに十分でなければなりません。ここに意味が潜在的に曖昧なので、コンパイラあなたがここに探している過負荷かを選択するためにいくつかの助けを与える必要があります。

+0

偉大ですが、なぜパラメータ型が 'IEnumerable 'ではなく 'string []'であれば、この特別なヘルプは不要ですか? – MaYaN

+1

@MaYaNどちらの場合も、両方のシグネチャに一致する可能性があります。メソッドが 'IEnumerable'を取るとき、暗黙のキャストがマッチする必要があります。他のメソッドの場合、そのようなキャストは必要ありません。コンプライアーの考えでは、これにより、最初のオーバーロードがより緊密に一致します。より具体的になると、コンパイラはあなたがしようとしていたことをより深く推測することができます。 – pquest

関連する問題