S と T が異なることとは何の関係もありません。最初のケースでは仮パラメータ型を指定し、2 番目のケースでは指定しないことに関係しています。
メソッドの型の推定では、デリゲートの仮パラメーターの型が判明するまで、ラムダからデリゲートの戻り値の型を推測しようとしません。
2 番目のケースでは、正式なパラメーターの型 T を推論するためにコンパイラーに何も与えていないため、ラムダの本体は分析されません。
「仮パラメータ型」とはどういう意味ですか?
仮パラメーターは、メソッド、インデクサー、コンストラクター、ラムダ、または匿名メソッドに渡される引数の値を取る変数です。(または、out
およびref
仮パラメーターの場合は、呼び出し元によって提供される変数のエイリアスになります。) 仮パラメーターは変数であるため、型があります。
デリゲートには、 typeのdelegate R Func<A, R>(A a);
仮パラメーターがあります。make するメソッド型パラメーターを使用してそれを構築するため、デリゲートの仮パラメーター型は になります。型推論のタスクは、これらの型とを推論することです。a
A
Func<S, T>
S
S
T
s
最初の例では、 type の仮パラメーターを持つラムダがありますstring
。したがって、このラムダ引数func
は method の仮パラメーターに対応しFun
、 の仮パラメーターの型はfunc
のFunc<S, T>
仮パラメーターの型は にs
対応する必要があるため、型推論の理由はS
です。の正式なパラメータ タイプを指定したためs
、S
は であると推測されますstring
。
その推論が行わT
れると、ラムダの本体を分析することで推論できます。
2番目のケースでは、に指定された正式なパラメータータイプはありませんt
。の型を推測できるものは他にないためt
、型推論は断念し、本体を見る前にこのラムダの分析を放棄します。
あなたの場合、ラムダの正式なパラメーターの型とは無関係に本体を分析できることがたまたまありました。これはまれなケースであり、型推論アルゴリズムはそれを利用するように作成されていません。
これが必要なタイプの推論である場合は、C# の代わりに F# を使用することを検討してください。Hindley-Milner アルゴリズムに基づく、はるかに高度な型推論アルゴリズムを備えています。