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, gunakan in kata kunci untuk mengizinkan argumen jenis kontravarian.
in Gunakan kata kunci di antarmuka generik dan delegasi.
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#.
Kontravarian memungkinkan Anda menggunakan jenis yang kurang diturunkan daripada jenis yang ditentukan oleh parameter generik. Fitur ini memungkinkan konversi implisit kelas yang mengimplementasikan antarmuka kontravarian dan konversi implisit jenis delegasi. Jenis referensi mendukung kovariansi dan kontravariansi dalam parameter jenis generik, tetapi jenis nilai tidak mendukung fitur ini.
Anda dapat mendeklarasikan jenis sebagai kontravarian dalam antarmuka generik atau mendelegasikan hanya jika mendefinisikan jenis parameter metode dan bukan jenis pengembalian metode.
In, ref, dan out parameter harus invariant, yang berarti tidak kovarian atau kontravarian.
Antarmuka yang memiliki parameter jenis kontravarian memungkinkan metodenya untuk menerima argumen jenis yang kurang diturunkan daripada yang ditentukan oleh parameter jenis antarmuka. Misalnya, di IComparer<T> antarmuka, jenis T kontravarian. Anda dapat menetapkan objek jenis IComparer<Person> ke objek jenis IComparer<Employee> tanpa menggunakan metode konversi khusus jika Employee mewarisi Person.
Anda dapat menetapkan delegasi kontravarian ke delegasi lain dengan jenis yang sama, tetapi dengan parameter jenis generik yang kurang diturunkan.
Untuk informasi selengkapnya, lihat Kovariansi dan Kontravariansi.
Antarmuka generik kontravarian
Contoh berikut menunjukkan cara mendeklarasikan, memperluas, dan mengimplementasikan antarmuka generik yang kontravarian. Ini juga menunjukkan bagaimana Anda dapat menggunakan konversi implisit untuk kelas yang mengimplementasikan antarmuka ini.
// Contravariant interface.
interface IContravariant<in A> { }
// Extending contravariant interface.
interface IExtContravariant<in A> : IContravariant<A> { }
// Implementing contravariant interface.
class Sample<A> : IContravariant<A> { }
class Program
{
static void Test()
{
IContravariant<Object> iobj = new Sample<Object>();
IContravariant<String> istr = new Sample<String>();
// You can assign iobj to istr because
// the IContravariant interface is contravariant.
istr = iobj;
}
}
Delegasi generik kontravarian
Contoh berikut menunjukkan cara mendeklarasikan, membuat instans, dan memanggil delegasi generik yang kontravarian. Ini juga menunjukkan bagaimana Anda dapat secara implisit mengonversi jenis delegasi.
// Contravariant delegate.
public delegate void DContravariant<in A>(A argument);
// Methods that match the delegate signature.
public static void SampleControl(Control control)
{ }
public static void SampleButton(Button button)
{ }
public void Test()
{
// Instantiating the delegates with the methods.
DContravariant<Control> dControl = SampleControl;
DContravariant<Button> dButton = SampleButton;
// You can assign dControl to dButton
// because the DContravariant delegate is contravariant.
dButton = dControl;
// Invoke the delegate.
dButton(new Button());
}
Spesifikasi bahasa C#
Untuk informasi selengkapnya, lihat Spesifikasi Bahasa C#. Spesifikasi bahasa adalah sumber definitif untuk sintaks dan penggunaan C#.