C# の型推論は大抵の場合型を推定してくれてジェネリックの型も推論で省略することができます。
特にジェネリックパラメータを推論によって省略できるため、メソッド使用時に型を書く手間がなくなり、コードの見た目もかなりすっきりできます。が、ごく一部で推論ができないケースがあるのでその紹介になります。
以下の2つの例は、言語仕様でどうしてもジェネリックの型を明示しないといけません。回避できないのであきらめましょう。
// ★★(1) 戻り値からは推論できない int result = Sample.Foo(); // CS0411 // メソッド 'Sample.Foo<T>()' の型引数を使い方から推論することはできません。 // 型引数を明示的に指定してください。 // // int result = Sample.Foo<int>(); ← 明示する必要がある // // ★★(2) 引数中のジェネリックなデリゲートからは推論できない int a = 10; Sample.Foo(value => Console.WriteLine(value)); // CS0411 // 'Sample.Foo<T>(Action<T>)' の型引数を使い方から推論することはできません。 // 型引数を明示的に指定してください。 // // Sample.Foo<int>(value => Console.WriteLine(value)); ← 明示する必要がある。 // // 但し、事前に型に入れておけばエラーは出ない(記述が長くなるので無駄) // Action<int> action = value => Console.WriteLine(value); // Sample.Foo(action); //