Bagikan melalui


Metode generik (panduan pemrograman C#)

Metode generik adalah metode yang dideklarasikan dengan parameter jenis, sebagai berikut:

static void Swap<T>(ref T lhs, ref T rhs)
{
    T temp;
    temp = lhs;
    lhs = rhs;
    rhs = temp;
}

Contoh kode berikut menunjukkan salah satu cara untuk memanggil metode dengan menggunakan int untuk argumen jenis:

public static void TestSwap()
{
    int a = 1;
    int b = 2;

    Swap<int>(ref a, ref b);
    System.Console.WriteLine(a + " " + b);
}

Anda juga dapat menghilangkan argumen jenis dan pengkompilasi akan menyimpulkannya. Panggilan ke Swap berikut ini setara dengan panggilan sebelumnya.

Swap(ref a, ref b);

Aturan yang sama untuk inferensi jenis berlaku untuk metode statis dan metode instans. Pengkompilasi dapat menyimpulkan parameter jenis berdasarkan argumen metode yang Anda berikan; tidak dapat menyimpulkan parameter jenis hanya dari batasan atau nilai pengembalian. Oleh karena itu, inferensi jenis tidak berfungsi dengan metode yang tidak memiliki parameter. Inferensi jenis terjadi pada waktu kompilasi sebelum pengkompilasi mencoba mengatasi tanda tangan metode yang kelebihan beban. Pengkompilasi menerapkan logika inferensi jenis ke semua metode generik yang memiliki nama yang sama. Dalam langkah resolusi beban berlebih, kompiler hanya mencakup metode generik di mana inferensi tipe berhasil.

Dalam kelas generik, metode non-generik dapat mengakses parameter jenis tingkat kelas, sebagai berikut:

class SampleClass<T>
{
    void Swap(ref T lhs, ref T rhs) { }
}

Jika Anda menentukan metode generik yang mengambil parameter jenis yang sama dengan kelas yang berisi, pengkompilasi menghasilkan CS0693 peringatan karena dalam cakupan metode, argumen yang disediakan untuk bagian dalam T menyembunyikan argumen yang disediakan untuk luar T. Jika Anda memerlukan fleksibilitas memanggil metode kelas generik dengan argumen jenis selain yang disediakan saat kelas dibuat, pertimbangkan untuk memberikan pengidentifikasi lain untuk parameter jenis metode, seperti yang ditunjukkan dalam GenericList2<T> contoh berikut.

class GenericList<T>
{
    // CS0693.
    void SampleMethod<T>() { }
}

class GenericList2<T>
{
    // No warning.
    void SampleMethod<U>() { }
}

Gunakan batasan untuk mengaktifkan operasi yang lebih khusus pada parameter jenis dalam metode. Versi Swap<T>, sekarang bernama SwapIfGreater<T>, ini hanya dapat digunakan dengan argumen jenis yang mengimplementasikan IComparable<T>.

void SwapIfGreater<T>(ref T lhs, ref T rhs) where T : System.IComparable<T>
{
    T temp;
    if (lhs.CompareTo(rhs) > 0)
    {
        temp = lhs;
        lhs = rhs;
        rhs = temp;
    }
}

Metode generik dapat kelebihan beban pada beberapa parameter jenis. Misalnya, semua metode berikut dapat ditemukan di kelas yang sama:

void DoWork() { }
void DoWork<T>() { }
void DoWork<T, U>() { }

Anda juga dapat menggunakan parameter jenis sebagai jenis pengembalian metode. Contoh kode berikut menunjukkan metode yang mengembalikan array jenis T:

T[] Swap<T>(T a, T b)
{
    return [b, a];
}

Spesifikasi Bahasa C#

Untuk informasi selengkapnya, lihat Spesifikasi Bahasa C#.

Lihat juga