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