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ます。右?
それで、私はどこで間違っているのですか?