6

オーバーロードされたジェネリック メソッドが 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を使用して実行されています (結果に関連する場合に備えて...)

4

1 に答える 1