重複の可能性:
ジェネリック メソッドとメソッドのオーバーロード
次のようなクラスがあるとします
class SortedList<K>
{
public string this[int i] { get { return "a"; /* dummy sample code */ } }
public string this[K key] { get { return "b"; /* dummy sample code */ } }
}
さて、何人かの男がそれを使用することを決定したとしましょう:
static string Test1<K>(K key) { return new SortedList<K>()[key]; }
コンパイラは、この呼び出しをK key
オーバーロードに解決します。
さて、これを言うことと対比してください
static string Test2(int key) { return new SortedList<int>()[key]; } // whoops
コンパイラはこれをint i
オーバーロードに解決します。
さて、哀れな魂が と言うTest1(0)
なら、彼が言った場合とは異なる結果を得るだろうTest2(0)
。
おかしなことに、どちらの場合も、コンパイラまたはランタイムはあいまいさを検出せず、エラーが発生しません。
代わりに、ランタイムは、値がジェネリックかどうかに関して動作を変更するだけであり、これは呼び出し元にとって明らかに予期しないものになる可能性があります。
行動が一貫していないのはなぜですか?
または、さらに良いことに、あいまいさのためにコンパイラ (または実行時) エラーが発生しないのはなぜですか?