ホームページ > バックエンド開発 > C++ > .NET コレクションのインデックス付きアクセスで共変動作を実現するにはどうすればよいですか?

.NET コレクションのインデックス付きアクセスで共変動作を実現するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-30 10:43:10
オリジナル
367 人が閲覧しました

How Can I Achieve Covariant Behavior with Indexed Access in .NET Collections?

共分散と IList の制限について理解する

共分散は、参照型をベースまたはインターフェイスの変数に割り当てることができるプログラミングの原則ですタイプ。ただし、コレクション、特に IList インターフェイスを考慮する場合、これはジレンマを引き起こします。

IList はインデックス付きアクセスを持つコレクションを表し、インデックスによって要素を取得できます。残念ながら、List のような組み込みの .NET コレクションは、 get と set インデクサーの両方を実装すると、完全な共変性が妨げられます。

インデックス付きアクセスによる共変コレクションのソリューション

この制限にもかかわらず、達成する方法はあります。インデックス付きアクセスを維持しながらの共変動作。

1. ReadOnlyCollections (.NET 4.5 以降)

IReadOnlyListおよび IReadOnlyCollectionは、.NET 4.5 で導入された共変インターフェイスです。 get インデクサーのみを備えているため、共変シナリオに適しています。リストおよび ReadOnlyCollection両方のインターフェースを実装します。

2.カスタム ラッパー

以前のバージョンの .NET でインデックス付きアクセスを備えた共変コレクションが必要な場合は、ラッパー クラスを作成できます。ラッパー クラスは IList をカプセル化します。 get インデクサーと IEnumerable のみを公開します。

次のコードは、CovariantList という名前のカスタム ラッパー クラスを示しています。 IList への共変アクセスを提供します:

public static class Covariance
{
    public static IIndexedEnumerable<T> AsCovariant<T>(this IList<T> tail)
    {
        return new CovariantList<T>(tail);
    }

    private class CovariantList<T> : IIndexedEnumerable<T>
    {
        private readonly IList<T> tail;

        public CovariantList(IList<T> tail)
        {
            this.tail = tail;
        }

        public T this[int index] { get { return tail[index]; } }
        public IEnumerator<T> GetEnumerator() { return tail.GetEnumerator();}
        IEnumerator IEnumerable.GetEnumerator() { return tail.GetEnumerator(); }
        public int Count { get { return tail.Count; } }
    }
}

public interface IIndexedEnumerable<out T> : IEnumerable<T>
{
    T this[int index] { get; }
    int Count { get; }
}
ログイン後にコピー

以上が.NET コレクションのインデックス付きアクセスで共変動作を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート