Type pattern menguji tipe runtime sebuah nilai lalu mengikat nilainya ke variabel baru yang bertipe itu. Bab Pattern Matching Dasar sudah menunjukkan bentuk is int angka; bab ini fokus pada pemanfaatannya di switch expression: urutan arm, perilaku terhadap tipe turunan, dan arm yang menerima nilai campuran dari katalog.

Mekanisme Uji Tipe dan Binding #

Pola T x cocok bila tipe runtime input adalah T atau turunan dari T; saat cocok, input terikat ke x yang hanya terlihat di arm tersebut. Bila input null, type pattern untuk tipe referensi tidak cocok, sehingga arm null atau discard yang menangkapnya. Variabel binding tidak menyalin data; ia menunjuk object yang sama dengan tipe yang lebih spesifik.

Contoh: Katalog Campuran #

csharp
public record Produk(string Nama);
public record Layanan(string Nama, int DurasiJam);

string Deskripsikan(object item) => item switch
{
    Produk p => $"Produk: {p.Nama}",
    Layanan l => $"Layanan {l.Nama} ({l.DurasiJam} jam)",
    string s => $"Teks promosi: {s}",
    int angka => $"Kode angka: {angka}",
    _ => "Item tidak dikenal"
};

Console.WriteLine(Deskripsikan(new Produk("Kopi Gayo")));
Console.WriteLine(Deskripsikan(new Layanan("Instalasi Mesin", 3)));
Console.WriteLine(Deskripsikan("Diskon Akhir Tahun"));
Console.WriteLine(Deskripsikan(88));
Console.WriteLine(Deskripsikan(2.5));

Output yang Dihasilkan:

text
Produk: Kopi Gayo
Layanan Instalasi Mesin (3 jam)
Teks promosi: Diskon Akhir Tahun
Kode angka: 88
Item tidak ditemukan

Mari kita bedah baris demi baris:

  1. object item sebagai parameter: Tipe statis object menyembunyikan tipe asli, sehingga switch expression wajib menguji tipe runtime lewat pola.
  2. Produk p => ...: Record Produk cocok pada arm pertama; binding p membawa anggota Nama yang bisa langsung dipakai di hasil.
  3. Layanan l => ...: Arm kedua menguji record berbeda; pencocokan tipe memastikan DurasiJam hanya diakses pada object yang memang memilikinya.
  4. string s dan int angka: Pola tipe bawaan bekerja sama seperti pola tipe buatan kita; setiap arm mengikat nama variabelnya sendiri.
  5. Deskripsikan(2.5): Nilai double tidak cocok dengan empat type pattern di atas, sehingga jatuh ke arm discard dan menghasilkan teks tidak dikenal.

Urutan Arm Menentukan Hasil #

Arm dievaluasi berurutan dan arm pertama yang cocok menang, sehingga arm tipe yang lebih spesifik harus diletakkan sebelum arm base class-nya. Pola Produk p juga cocok untuk record apa pun yang mewarisi Produk; bila suatu saat ada ProdukDigital : Produk, arm turunan harus berada di atas arm induk agar tercapai.