冗長?、情調?

artonさんの昨日のエントリより。

public class FooBar : IEnumerable
{
    public IEnumerator GetEnumerator()
    {
        yield return bar++; 
    }
    IEnumerable.IEnumerator GetEnumerator()
    {
        return GetEnumerator();
    }
}

C#の場合、IEnumeratorとIEnumeratorは違う型なので上のように実装する必要がある。C#からジェネリクスに入った私には別に違和感は無いけれど、(冗長で)嫌だと言われてみれば確かにそうかも。

Javaジェネリクスはイレイジャなので、同様のインタフェースがあってyieldキーワードも使えたとすれば恐らく二つ目のGetEnumeratorは不要のはずだ。

public class FooBar implements IEnumerable{
    public IEnumerator getEnumerator() {
        yield return bar++; //実際にはこんなんないけど
    }
}
:
IEnumerator e = new FooBar().getEnumerator(); //はOK

覚え立ては型情報が厳格なC#ジェネリクスの方が元々好きだったんだが、上の例の様にイレイジャは実装時の制限が緩くなり、結果として記述量も減るのでJavaも悪くないなと思うようになった。※逆に言うと、キャストを減らしコード記述量が減るどころか却って記述量が増えている感に襲われるのがジェネリクス。前から書いているが

Dictionary, IEnumerable> dic = new Dictionary, IEnumerable>();

Dictionary, IEnumerable> dic = new();

で書きたいんだよな。って、C#3.0ではvarキーワードと型推論が使えるから短く書けるのかな? (まだあまり使ってないのがばればれ)