クエリ式での変数型の明示と明示的キャスト

id:siokoshou:20071125#p2 を読んでいて気付きましたが,昨日の id:NyaRuRu:20071125:p1 で示した次の 2 つは別物ですな.

List<int> list;

//B4 - 型を明記した場合4
(from int i in list select i*Math.PI).ToList<double>().ForEach(Console.WriteLine);

//B6 - 型を明記しない場合2
(from i in list select i*Math.PI).ToList().ForEach(Console.WriteLine);

コンパイル時コード変換による変換後の結果は以下.

//B4' - B4 の等価コード
list.Cast<int>().Select<int, double>((int i) => i*Math.PI).ToList<double>().ForEach(Console.WriteLine);

//B6' - B6 の等価コード
list.Select<int, double>((int i) => i*Math.PI).ToList<double>().ForEach(Console.WriteLine);

int から int へのキャストは自明に除去できるものですが,クエリ式の変換ルールを正直に適応した結果残るようです.
だからここは「型を明示している」とみなすのではなく,「強制的にキャストする構文である」とみなした方が動作としては正しいと.