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:
Untuk Versi .NET Terdahulu:
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; } }
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!