Bagikan melalui


in (Pengubah Generik) (Referensi C#)

Untuk parameter jenis generik, kata kunci in menentukan bahwa parameter jenisnya adalah kontravarian. Anda dapat menggunakan kata kunci in di antarmuka generik dan delegasi.

Kontravarian memungkinkan Anda untuk menggunakan jenis turunan yang lebih sedikit daripada yang ditentukan oleh parameter generik. Ini memungkinkan konversi implisit kelas yang menerapkan antarmuka kontravarian dan konversi implisit jenis delegasi. Kovarian dan kontravarian dalam parameter jenis generik didukung untuk jenis referensi, tetapi tidak didukung untuk jenis nilai.

Suatu jenis dapat dideklarasikan kontravarian dalam delegasi atau antarmuka generik hanya jika jenis tersebut menentukan jenis parameter metode dan bukan jenis pengembalian metode. Parameter In, ref, dan out harus invarian, artinya keduanya bukan kovarian atau kontravarian.

Antarmuka yang memiliki parameter jenis kontravarian memungkinkan metodenya menerima argumen dari jenis turunan yang lebih sedikit daripada yang ditentukan oleh parameter jenis antarmuka. Misalnya, di antarmuka IComparer<T>, jenis T adalah kontravarian, Anda dapat menetapkan objek berjenis IComparer<Person> ke objek berjenis IComparer<Employee> tanpa menggunakan metode konversi khusus apa pun jika Employee mewarisi Person.

Delegasi kontravarian dapat diberikan delegasi lain dengan jenis yang sama, tetapi dengan parameter jenis generik yang lebih sedikit diturunkan.

Untuk informasi selengkapnya, lihat Kovarian dan Kontravarian.

Antarmuka generik kontravarian

Contoh berikut menunjukkan cara mendeklarasikan, memperluas, dan menerapkan antarmuka generik kontravarian. Ini juga menunjukkan bagaimana Anda dapat menggunakan konversi implisit untuk kelas yang menerapkan 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 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#.

Lihat juga