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

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

Patricia Arquette
リリース: 2024-12-28 12:51:24
オリジナル
166 人が閲覧しました

How Can I Achieve Covariance with Index Access in .NET Collections?

.NET でのインデックス アクセス サポートによる共分散の利用

共分散により、プログラマは明示的な型キャストを行わずに派生クラスを基本クラスとして扱うことができます。ただし、.NET では、インデックス アクセスのサポートがない共変コレクションに関する制限があります。この問題は、特定の型のコレクション (例: Dog オブジェクトを保持する List) をその基本型のコレクション (例: Animal) に変換しようとすると発生します。

根本的な問題について

この問題は、List が Add メソッドを構成する ICollection を実装しているという事実に起因します。動物ベースの IList にアップキャストすると、元のコレクションの型制約に違反して、あらゆる種類の動物を無差別に追加できます。

インデックスをサポートする共変コレクション

.NET 4.5 および後:

  • IReadOnlyListIReadOnlyCollection は両方とも共変です。
  • Listこれらのインターフェイスを実装し、共分散原則に違反することなく要素を取得できる取得専用インデクサーを提供します。

以前の .NET バージョンの場合:

  • 共分散インデックスのサポート付きは、以前の .NET ではネイティブに利用できません
  • カスタム ラッパー アプローチ: 1 つの解決策には、IEnumerable インターフェイスと get インデクサー インターフェイスのみを公開するカスタム クラスで元のコレクションをラップすることが含まれます。このアプローチにより、インデックス アクセス機能を維持しながら共分散が保証されます。

実装:

次の C# コードは、共分散拡張メソッドを使用したカスタム ラッパー アプローチを示しています。

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; }
}
ログイン後にコピー

この拡張メソッドを使用すると、次のようにインデックスをサポートする共変コレクションを作成できます。次の例では:

List<Dog> dogs = new List<Dog>();

IIndexedEnumerable<Animal> animals = dogs.AsCovariant();
ログイン後にコピー

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

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