Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Untuk parameter jenis generik, out kata kunci menentukan bahwa parameter jenis kovarian.
out Gunakan kata kunci di antarmuka generik dan delegasi.
Kovarians memungkinkan Anda menggunakan jenis yang lebih turunan daripada parameter generik yang ditentukan. Fitur ini memungkinkan konversi implisit kelas yang mengimplementasikan antarmuka kovarian dan konversi implisit jenis delegasi. Jenis referensi dukungan kovariansi dan kontravariansi, tetapi tidak mendukung jenis nilai.
Antarmuka dengan parameter jenis kovarian memungkinkan metodenya untuk mengembalikan jenis yang lebih turunan daripada yang ditentukan oleh parameter jenis. Misalnya, karena di .NET, dalam IEnumerable<T>, jenis T kovarian, Anda dapat menetapkan objek jenis IEnumerable<string> ke objek jenis IEnumerable<object> tanpa menggunakan metode konversi khusus.
Anda dapat menetapkan delegasi kovarian ke delegasi lain dengan jenis yang sama, tetapi dengan parameter jenis generik yang lebih turunan.
Untuk informasi selengkapnya, lihat Kovariansi dan Kontravariansi.
Referensi bahasa C# mendokumentasikan versi bahasa C# yang paling baru dirilis. Ini juga berisi dokumentasi awal untuk fitur dalam pratinjau publik untuk rilis bahasa yang akan datang.
Dokumentasi mengidentifikasi fitur apa pun yang pertama kali diperkenalkan dalam tiga versi terakhir bahasa atau dalam pratinjau publik saat ini.
Petunjuk / Saran
Untuk menemukan kapan fitur pertama kali diperkenalkan di C#, lihat artikel tentang riwayat versi bahasa C#.
Contoh berikut menunjukkan cara mendeklarasikan, memperluas, dan mengimplementasikan antarmuka generik kovarian. Ini juga menunjukkan cara menggunakan konversi implisit untuk kelas yang mengimplementasikan antarmuka kovarian.
// Covariant interface.
interface ICovariant<out R> { }
// Extending covariant interface.
interface IExtCovariant<out R> : ICovariant<R> { }
// Implementing covariant interface.
class Sample<R> : ICovariant<R> { }
class Program
{
static void Test()
{
ICovariant<Object> iobj = new Sample<Object>();
ICovariant<String> istr = new Sample<String>();
// You can assign istr to iobj because
// the ICovariant interface is covariant.
iobj = istr;
}
}
Dalam antarmuka generik, nyatakan parameter jenis kovarian jika memenuhi kondisi berikut:
Anda menggunakan parameter jenis hanya sebagai jenis pengembalian metode antarmuka dan tidak menggunakannya sebagai jenis argumen metode.
Nota
Ada satu pengecualian untuk aturan ini. Jika antarmuka kovarian memiliki delegasi generik kontravarian sebagai parameter metode, Anda dapat menggunakan jenis kovarian sebagai parameter jenis generik untuk delegasi ini. Untuk informasi selengkapnya tentang delegasi generik kovarian dan kontravarian, lihat Varians dalam Delegasi dan Menggunakan Varians untuk Delegasi Generik Func dan Tindakan.
Anda tidak menggunakan parameter jenis sebagai batasan generik untuk metode antarmuka.
Contoh berikut menunjukkan cara mendeklarasikan, membuat instans, dan memanggil delegasi generik kovarian. Ini juga menunjukkan cara mengonversi jenis delegasi secara implisit.
// Covariant delegate.
public delegate R DCovariant<out R>();
// Methods that match the delegate signature.
public static Control SampleControl()
{ return new Control(); }
public static Button SampleButton()
{ return new Button(); }
public void Test()
{
// Instantiate the delegates with the methods.
DCovariant<Control> dControl = SampleControl;
DCovariant<Button> dButton = SampleButton;
// You can assign dButton to dControl
// because the DCovariant delegate is covariant.
dControl = dButton;
// Invoke the delegate.
dControl();
}
Dalam delegasi generik, nyatakan jenis kovarian jika Anda menggunakannya hanya sebagai jenis pengembalian metode dan bukan untuk argumen metode.
Spesifikasi bahasa C#
Untuk informasi selengkapnya, lihat Spesifikasi Bahasa C#. Spesifikasi bahasa adalah sumber definitif untuk sintaks dan penggunaan C#.