もれなくおまけがついてくるがいらない

さぁ文句を垂らすぞー。
System.Collections.Generic.IEnumerable<T>はSystem.Collections.IEnumerableも含んでいる。この非ジェネリックのIEnumerableというのが面倒で、自分でIEnumeratorを実装しようとするとC++/CLIでは例えばこうなる:

generic<typename Elem>
ref class MyEnumerable() : public System::Collections::Generic::IEnumerable<Elem>
{
    // こいつだ!こいつがいけないんだ!
    virtual System::Collections::IEnumerator^
        GetEnumeratorNonGeneric() sealed = System::Collections::IEnumerable::GetEnumerator
    {
        //...
    }
    //...
public:
    virtual System::Collections::Generic::IEnumerator<Elem>^
        GetEnumerator() = System::Collections::Generic::IEnumerable<Elem>::GetEnumerator
    {
        //...
    }
    //...
};

明らかにSystem.Collections.IEnumerable.GetEnumeratorのほうの実装は全然いらん。いらなさすぎる。しかし使わないがインターフェースにあるのだから実装しなくてはいけない。for eachで適当に要素を拾ってくる列挙子を書く人間としてはこれと同じ理由で使わない実装を書かなければいけないIEnumerator<T>も面倒でたまらん。
あとarray<T>がIEnumerable<T>に変換できないのも不満。いちいちObject^経由でIEnumerable<T>^へキャストしているのだが、ものすごい理不尽である。まぁそっちに関しては、

generic<typename T>
System::Collections::Generic::IEnumerable<T>^ array_cast(array<T>^ ar) {
    return static_cast<System::Collections::Generic::IEnumerable<T>^>(static_cast<Object^>(ar));
}

とか書いて適当にごにょごにょしているが。