オーバーロードされたジェネリック メソッドが 2 つあります。
T Foo<T>(T t) { Console.WriteLine("T"); return t; }
T Foo<T>(int i) { Console.WriteLine("int"); return default(T); }
Foo
コンピューターで次のように呼び出そうとすると:
Foo(5);
コンパイラ エラーや警告は表示されず、ジェネリック引数を持つ最初のメソッドが呼び出されます (つまり、出力は ですT
)。これは、すべての C# 化身およびすべてのプラットフォームに当てはまりますか? その場合、なぜですか?
一方、ジェネリック呼び出しで型を明示的に指定すると、次のようになります。
Foo<int>(5);
引数を持つ2 番目のメソッドint
が呼び出されます。つまり、出力は now になりint
ます。なんで?
2 つのメソッド オーバーロードで異なる引数名を使用しているため、次の呼び出しからの出力は期待どおりです。
Foo<int>(t: 5); // output 'T'
Foo<int>(i: 5); // output 'int'
最初のメソッドを呼び出す場合は、型指定を省略することもできます。
Foo(t: 5); // output 'T'
しかし、これをコンパイルしようとすると:
Foo(i: 5);
エラーが表示されますメソッド 'Foo(int)' の型引数を使用法から推測できません。型引数を明示的に指定してみてください。 コンパイラがこの呼び出しを処理できないのはなぜですか?
注:これらのテストは、Windows 8 x64 システムでLinqPadを使用して実行されています (結果に関連する場合に備えて...)