Deklarasi string namaProduk = "Kopi Gayo"; menyebut tipe dua kali: di sisi kiri sebagai tipe variable, di sisi kanan sebagai tipe literal. Keyword var memangkas pengulangan tersebut: programmer menulis tipe sekali, dan compiler menyimpulkan sisanya dari inisialisasi. Bab ini membahas cara kerja inferensi tipe, batasan yang ditegakkan compiler, serta kapan var layak dipakai.
Cara Kerja Inferensi Tipe #
var namaProduk = "Kopi Gayo";
var hargaPerPaket = 85000;
Console.WriteLine(namaProduk);
Console.WriteLine(namaProduk.GetType());
Console.WriteLine(hargaPerPaket);
Console.WriteLine(hargaPerPaket.GetType());
hargaPerPaket = 92000;
Console.WriteLine(hargaPerPaket);Output yang Dihasilkan:
Kopi Gayo
System.String
85000
System.Int32
92000Mari kita telaah baris demi baris:
- Baris 1 (
var namaProduk = "Kopi Gayo";): Compiler membaca sisi kanan, menyimpulkan tipestring, lalu mencatat variable sebagaistringsejak kompilasi. - Baris 2 (
var hargaPerPaket = 85000;): Literal integer tanpa suffix disimpulkan sebagaiint, sama seperti deklarasi eksplisit. - Baris 4 dan 6 (
GetType()): Output membuktikan inferensi bersifat compile-time; tipe sudah tercatat pasti, bukan ditunda ke runtime. - Baris 8-9 (
hargaPerPaket = 92000;): Variablevartetap boleh diganti nilainya, asalkan tipenya sama.
var bukan tipe tanpa tipe. Setiap variable var memiliki tipe yang pasti dan tercatat pada compiler; yang ditunda hanya penulisan tipe oleh programmer. Keyword ini juga hanya sah untuk variable lokal; bentuk deklarasi lain pada C# tetap menuntut tipe eksplisit.
Tiga Aturan yang Ditegakkan Compiler #
Aturan pertama: var wajib disertai inisialisasi. Tanpa sisi kanan, compiler tidak punya bahan untuk menyimpulkan:
var nama;Pesan compiler:
Program.cs(1,5): error CS0818: Implicitly-typed variables must be initializedAturan kedua: null saja tidak cukup sebagai inisialisasi, karena null tidak memberi petunjuk tipe:
var nama = null;Pesan compiler:
Program.cs(1,5): error CS0815: Cannot assign <null> to an implicitly-typed variableAturan ketiga: tipe terkunci setelah deklarasi. Mengisi nilai dengan tipe lain ditolak:
var nama = "Budi";
nama = 5;Pesan compiler:
Program.cs(2,8): error CS0029: Cannot implicitly convert type 'int' to 'string'Variable nama disimpulkan bertipe string sejak baris 1, sehingga angka 5 tidak dapat masuk. Salinan lengkap ketiga pesan memuat path project; bagian itu dipangkas agar ringkas.
Ketiga pesan di atas muncul saat kompilasi, sebelum program berjalan. Perilaku ini berbeda dengan dynamic yang menunda segala pemeriksaan; pada var, kesalahan tipe masih bisa tertangani di editor sebelum kode dijalankan.