全てが E になる

C# 3.0 におけるルール E の存在.



ジェットコースターのような先週,私は一足先に解答編を聞いてしまったのですが.
言われてみればとてもシンプルなルール.いやほんと,波村さんに言われるまで全然気づきませんでした.

var x = new MyClass() { ID = 123 };
var y = new List<MyClass>() { new MyClass(){ID = 1}, new MyClass(){ID = 2} };
var z = new { ID = 1, Name = "Foo" };

記法が変? 必要な理由が分からない?
全てはルール E の必然.S では駄目だった.だから E.

static void Main(string[] args)
{
    Expression<Func<int, IEnumerable<List<MyClass>>>> expr =
        X => from Y in Enumerable.Range(0, X)
             from Z in Enumerable.Range(X, Y)
             select new List<MyClass>()
                {
                    new MyClass{ID = X},
                    new MyClass{ID = Y},
                    new MyClass{ID = Z}
                };

    Console.WriteLine(expr.ToString());
}

X => Range(0, X).SelectMany(Y => Range(X, Y), (Y, Z) => new List`1() {Void Add(MyClass)(new MyClass() {ID = X}), Void Add(MyClass)(new MyClass() {ID = Y}), Void Add(MyClass)(new MyClass() {ID = Z})})

うーん,『C# 3.0を256倍使うための本 邪悪編』書きたくなってきたかも.需要は皆無に見えますけど.
内容は邪悪な型推論とか邪悪な partial の使い方とかとか邪悪なメタプログラミングとか.とにかく邪悪な方向で.