1

IEnumerable:の評価を強制できるようにするために、次の拡張方法があると仮定してください。

public static List<T> EvaluateNow<T>(this IEnumerable<T> collection)
{
    if (collection == null)
    {
        throw new ArgumentNullException("collection");
    }
    else
    {
        return (collection.ToList());
    }
}

IList<T>このメソッドの戻り型(つまり、インターフェイスへのダウンキャスト)の代わりにList<T>、メソッドとその依存関係を特定の実装に結び付けない(つまり、戻り値が常に実際にある場合でも)ことに意味があるかどうかを尋ねたいと思います。 a List)。

4

2 に答える 2

3

このような状況では、クラスではなくインターフェイスを使用することをお勧めします
理由が多すぎてここに入ることができませんが、たとえば、どのクラスIList<T>もこの関数の戻り値に割り当てることができるインターフェイスを実装するだけでよいため、柔軟性が大幅に向上します。クラスは、List(または同等のもの)をサブクラス化せずに、この(または他の)インターフェースを実装します。
一般に、要件に適合する「最も低い」階層型インターフェースを使用する必要があります。この場合、ICollection、またはIListの代わりにIEnumerableを検討することができます。

'interface'のみが返されるため、関数から返すクラスインスタンスは関係ありません。したがって、そのインターフェイスを実装する任意のクラスに割り当てることができます(ここでも、最大の柔軟性?)

多くの場合、IEnumerableオブジェクトを返す関数は、ほとんどの場合、foreachループ内で使用されます。

于 2011-10-01T13:24:30.310 に答える
1

拡張メソッドは、インスタンスでのみ呼び出すことができます。これは、それがあなたのメソッドcollectionに含まれることは決してないことを意味nullします。

だから...書かれているように、あなたのメソッドは拡張メソッドとまったく同じ振る舞いをしてIEnumerable.ToListいるので、私には何の意味もありません。

IListアーロンが彼の答えで説明しているように、そのリターンタイプがあれば便利でしょう。

なぜIEnumerable.ToListまだ返さないのかはIList、ライブラリ設計者にとって良い質問です。

于 2011-10-01T13:28:58.923 に答える