Menulis BuatPasangan<int>(7, 42) berulang-ulang terasa melelahkan, padahal kedua argumen sudah memperlihatkan tipenya secara jelas. Compiler C# mampu menarik kesimpulan itu sendiri melalui mekanisme type inference. Bab ini membedah cara compiler menyimpulkan type argument, batasan mekanismenya, dan pesan galat yang muncul ketika kesimpulan gagal.
Cara Compiler Menyimpulkan Type Argument #
Ketika pemanggil tidak menulis type argument, compiler memeriksa tipe setiap argumen lalu mencari satu tipe T yang cocok dengan seluruh argumen:
public static (T Pertama, T Kedua) BuatPasangan<T>(T a, T b)
{
return (a, b);
}
var pasanganAngka = BuatPasangan(7, 42);
Console.WriteLine($"{pasanganAngka.Pertama}, {pasanganAngka.Kedua}");
var pasanganNama = BuatPasangan<string>("Budi", "Siti");
Console.WriteLine($"{pasanganNama.Pertama}, {pasanganNama.Kedua}");
Console.WriteLine(BuatPasangan(2.5, 1.5).Pertama.GetType().Name);Output yang Dihasilkan:
7, 42
Budi, Siti
DoubleMari kita bedah baris demi baris:
(T Pertama, T Kedua) BuatPasangan<T>(T a, T b): Return type tuple dan kedua parameter sama-sama memakaiT, sehingga ketiganya menjadi petunjuk bagi compiler.BuatPasangan(7, 42): Kedua argumen bertipe int; compiler menyimpulkanT=int, danpasanganAngkamenjadi tuple(int Pertama, int Kedua)tanpa kita menulis tipe apa pun.BuatPasangan<string>(...): Type argument ditulis eksplisit; compiler memverifikasi kedua argumen bertipe string.BuatPasangan(2.5, 1.5).Pertama.GetType().Name: Literal 2.5 dan 1.5 bertipe double, sehingga compiler menyimpulkanT=double;GetType().Namemembuktikannya dengan mencetakDouble.
Bila Inference Gagal #
Inference menuntut satu kesimpulan yang tunggal. Bila argumen menyodokkan kandidat yang berbeda, compiler menyerah. Pemanggilan BuatPasangan(7, "lima") menyajikan kandidat int dan string sekaligus, dan compiler menolak program tersebut dengan pesan berikut (pesan asli .NET SDK 9.0.319, path project dipangkas):
error CS0411: The type arguments for method 'Program.BuatPasangan<T>(T, T)' cannot be inferred from the usage. Try specifying the type arguments explicitly.Pesan tersebut menawarkan dua jalan keluar: samakan tipe kedua argumen, atau tulis type argument secara eksplisit seperti BuatPasangan<object>(7, "lima") bila memang itu yang dimaksud.
Batasan Mekanisme Inference #
- Type inference hanya bekerja untuk generic method; instantiasi generic class tetap menuntut type argument yang tertulis, misalnya
new Kotak<Buku>(novel). - Inference membaca tipe argumen pada pemanggilan, bukan maksud kita; konversi implisit kecil seperti int ke double tidak dikerjakan compiler demi kesimpulan tunggal.
- Target-typed new (
new()) dapat mengurangi penulisan berulang pada sisi instantiasi, karena tipe diambil dari sisi kiri penugasan.
Dengan memahami inference, kita menulis kode generik yang ringkas tanpa mengurangi kepastian tipe.