C#言語仕様では、セクション§7.5.2で型推論について説明しています。その中には私にはわからない詳細があります。次の場合を考えてみましょう。
// declaration
void Method<T>(T obj, Func<string, T> func);
// call
Method("obj", s => (object) s);
MicrosoftとMonoC#コンパイラはどちらもT
=object
を正しく推測しますが、仕様のアルゴリズムを理解するとT
=が生成されstring
、失敗します。これが私がそれを理解する方法です:
最初のフェーズ
Eiが無名関数の場合、EiからTiへの明示的なパラメーター型推論(§7.5.2.7)が行われます。
⇒ラムダ式には明示的なパラメータータイプがないため、効果はありません。右?
それ以外の場合、EiのタイプがUで、xiが値パラメーターの場合、UからTiへの下限推論が行われます。
⇒最初のパラメータは静的タイプな
string
ので、これはstring
の下限に追加されT
ますよね?
第二段階
Xjに依存しない(§7.5.2.5)すべての非固定型変数Xiは固定されています(§7.5.2.10)。
⇒
T
固定されていません。T
何にも依存していません...だからT
修正する必要がありますよね?
§7.5.2.11修正
候補タイプのセットUjは、Xiの境界のセット内のすべてのタイプのセットとして始まります。
⇒{
string
(下限)}次に、Xiの各境界を順番に調べます。[...] Xiの各下限Uについて、Uからの暗黙の変換がないすべてのタイプUjが候補セットから削除されます。[...]
⇒候補セットから何も削除されませんよね?
残りの候補タイプUjの中に、他のすべての候補タイプへの暗黙の変換がある一意のタイプVがある場合、XiはVに固定されます。
⇒候補タイプは1つしかないため、これは空虚な真であり、Xiはに固定され
string
ます。右?
それで、私はどこで間違っているのですか?