Cast (tipe)nilai sudah kita pakai untuk angka pada bab Konversi Tipe: cast numerik mengubah representasi nilai, misalnya 87.75 menjadi 87. Cast punya wajah lain pada hierarki tipe berbasis object: cast di sana tidak mengubah object sama sekali, melainkan mengubah sudut pandang tipe dari sebuah reference. Bab ini fokus pada wajah kedua tersebut, yang bekerja pada reference type.

Upcasting: Menyimpan Turunan sebagai Induk #

string adalah turunan dari object. Menyimpan string ke variable object bergerak naik dalam hierarki (upcasting) dan berjalan tanpa cast eksplisit:

csharp
string teks = "Belajar C#";
object penyimpan = teks;

Console.WriteLine(penyimpan);
Console.WriteLine(penyimpan.GetType());

Output yang Dihasilkan:

text
Belajar C#
System.String

Mari kita telaah:

  1. Baris 2 (object penyimpan = teks;): Upcasting berjalan otomatis; variable object menampung reference ke object string yang sama.
  2. Baris 4: Nilai tetap terbaca penuh lewat variable object.
  3. Baris 5 (penyimpan.GetType()): GetType() membuktikan object yang tersimpan tetap System.String; upcasting tidak mengubah object, hanya melebarkan sudut pandang variable.

Downcasting: Kembali ke Tipe Turunan #

Bergerak turun dari object ke tipe turunannya (downcasting) menuntut cast eksplisit, karena tidak setiap object berisi string:

csharp
object penyimpan = "Belajar C#";
string kembali = (string)penyimpan;

Console.WriteLine(kembali);

Output yang Dihasilkan:

text
Belajar C#

Compiler menerima downcasting karena programmer menyatakannya secara eksplisit; runtime yang memverifikasi kecocokan tipe. Ketika verifikasi gagal, program berhenti dengan exception:

csharp
object angka = 2025;
string teksSalah = (string)angka;

Output yang Dihasilkan:

text
Unhandled exception. System.InvalidCastException: Unable to cast object of type 'System.Int32' to type 'System.String'.
   at Program.<Main>$(String[] args) in Program.cs:line 2

Runtime menemukan object berisi System.Int32, bukan System.String, sehingga InvalidCastException diangkat dan program berhenti. Perhatikan: cast reference tidak mengubah isi object; cast hanya menyatakan sudut pandang, dan runtime menolak sudut pandang yang tidak sesuai.

Operator as dan is #

Cast yang gagal menghentikan program. Dua operator memberi jalur yang lebih terkendali: as menghasilkan null bila tipe tidak cocok, sedangkan is melaporkan kecocokan sebagai bool:

csharp
object penyimpan = "Belajar C#";
object angka = 2025;

Console.WriteLine(angka is string);
Console.WriteLine(angka is int);
Console.WriteLine(penyimpan is string);
Console.WriteLine(angka as string == null);

string kembali = (string)penyimpan;
Console.WriteLine(kembali);

if (angka is int bilangan)
{
    Console.WriteLine(bilangan * 2);
}

Output yang Dihasilkan:

text
False
True
True
True
Belajar C#
4050

Mari kita telaah:

  1. Baris 4-6 (operator is): is memeriksa tipe sebenarnya dari object: 2025 bukan string tetapi int, sedangkan object string lolos pemeriksaan is string.
  2. Baris 7 (angka as string == null): as menghasilkan null karena angka bukan string; perbandingan dengan null menghasilkan True.
  3. Baris 9-10: Downcasting klasik berhasil karena object memang string.
  4. Baris 12-15 (angka is int bilangan): Type pattern menggabungkan pemeriksaan dan penamaan: bila angka bertipe int, nilai itu tersalin ke variable baru bilangan, lalu blok mengalikan nilainya menjadi 4050.

Blok if dan pola kondisi lainnya dibedah pada section Control Flow; di sini cukup catat pola obj is Tipe namaVariable sebagai cara aman memeriksa sekaligus mengambil nilai.

Memilih Teknik Cast #

  • Cast (Tipe)nilai: kecocokan tipe sudah pasti; kegagalan menghentikan program.
  • Operator as: ketidakcocokan diterima sebagai null, tanpa exception.
  • Type pattern obj is Tipe t: pemeriksaan dan pengambilan nilai berlangsung sekaligus.
  • Konversi antar tipe numerik: kembali ke bab Konversi Tipe; cast numerik mengubah representasi nilai, sedangkan cast reference tidak menyentuh object.