私はC#を深く読んでいて、親愛なる作者によって説明された2フェーズ型推論規則で混乱しました。
コードを考えてみましょう:
static void PrintConvertedValue<TInput,TOutput> (TInput input, Converter<TInput,TOutput> converter)
{ Console.WriteLine(converter(input)); }
...
PrintConvertedValue("I'm a string", x => x.Length);
その後、彼は2相推論アルゴリズムを使用した推論のプロセスを説明します。
1.フェーズ1が始まります。
2.最初のパラメーターはTInput型であり、最初の引数はstring型です。文字列からTInputへの暗黙の変換が必要であると推測します。
3. 2番目のパラメーターはConverter型であり、2番目の引数は暗黙的に型指定されたラムダ式です。推論は実行されません—十分な情報がありません。
4.フェーズ2が始まります。
5.
TInput
固定されていない型パラメータに依存しないため、文字列に固定されます。6. 2番目の引数の入力タイプは固定されていますが、出力タイプは固定されていません。それをと見なし
(string x) => x.Length
、戻り型をintとして推測することができます。したがって、暗黙の変換はintから。に行われる必要がありますTOutput
。7.フェーズ2が繰り返されます。
8.
TOutput
固定されていないものには依存しないため、intに固定されます。9固定されていない型パラメーターがないため、推論は成功します
私はステップ2とステップ5と非常に混同しています。ステップ2では、コンパイラーはどのようにしてそのような推論を行うことができますか?つまり、世界の転換はどのように現場にもたらされるのでしょうか?変換は、BTWタイプのパラメーターやタイプではなく、BTWタイプで行われます。
そしてステップ5は私を完全に理解しませんでした、タイプパラメータが他のタイプパラメータに依存する可能性がある簡単な例を誰かが私に提示できますか?作者が何を意味しようとしているのか説明してください。
私はあえてC#仕様に潜入しましたが、私のようなサルではなく、非常によく似たインテリジェントな人々のためにインテリジェントな人々がそれを作ったようです:)