Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mencapai Kovarian dengan Akses Indeks dalam Koleksi .NET?

Bagaimanakah Saya Boleh Mencapai Kovarian dengan Akses Indeks dalam Koleksi .NET?

Patricia Arquette
Patricia Arquetteasal
2024-12-28 12:51:24162semak imbas

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

Memanfaatkan Kovarian dengan Sokongan Akses Indeks dalam .NET

Kovarian membolehkan pengaturcara untuk menganggap kelas terbitan sebagai kelas asas mereka tanpa pemutus jenis eksplisit. Walau bagaimanapun, dalam .NET, terdapat had dengan koleksi kovarian yang tidak mempunyai sokongan akses indeks. Isu ini timbul apabila cuba menukar koleksi jenis tertentu (cth., Senarai yang memegang objek Anjing) kepada koleksi jenis asasnya (cth., Haiwan).

Memahami Isu Asas

Masalahnya berpunca daripada fakta bahawa List melaksanakan ICollection, yang terdiri daripada kaedah Tambah. Upcasting kepada IList berasaskan haiwan akan membenarkan penambahan sembarangan mana-mana jenis haiwan, melanggar kekangan jenis koleksi asal.

Koleksi Kovarian dengan Sokongan Indeks

Dalam .NET 4.5 dan kemudian:

  • IReadOnlyList dan IReadOnlyCollection kedua-duanya adalah kovarian.
  • L&t< ; dan ReadOnlyCollection laksanakan antara muka ini, menyediakan pengindeks dapatkan sahaja yang mampu mendapatkan semula elemen tanpa melanggar prinsip kovarians.

Untuk Versi .NET Terdahulu:

    Kovarians dengan sokongan indeks tidak tersedia secara asli dalam .NET yang lebih awal versi.
  • Pendekatan Pembungkus Tersuai: Satu penyelesaian melibatkan pembungkusan koleksi asal dalam kelas tersuai yang mendedahkan hanya IEnumerable dan dapatkan antara muka pengindeks. Pendekatan ini memastikan kovarians sambil mengekalkan kefungsian akses indeks.

Pelaksanaan:

Kod C# berikut menunjukkan pendekatan pembalut tersuai menggunakan kaedah sambungan Kovarian:

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; }
}
Kaedah sambungan ini membolehkan anda mencipta koleksi kovarian dengan sokongan indeks, seperti yang dilihat dalam yang berikut contoh:

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencapai Kovarian dengan Akses Indeks dalam Koleksi .NET?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn