Pemilik toko perlu menjumlahkan daftar harga baik dalam rupiah bulat (int) maupun dalam pecahan berat (double). Sebelum .NET 7, satu method generik tidak dapat menjumlahkan kedua tipe itu, karena compiler tidak menjamin T memiliki operator +. Solusi lama adalah menulis overload per tipe. Generic math memperbaiki situasi ini dengan interface numerik yang mengekspos operator dan konstanta pada type parameter; fitur ini membutuhkan .NET 7 dan C# 11.
Interface INumber<T> #
INumber<T> dideklarasikan di namespace System.Numerics dan mewarisi rangkaian interface aritmetika seperti IAdditionOperators<T, T, T> serta IMultiplyOperators<T, T, T>. Seluruh tipe numerik bawaan, termasuk int, double, decimal, long, dan float, sudah mengimplementasikan interface tersebut, sehingga satu constraint membuka operator penuh bagi badan method generik. Konstanta dasar juga tersedia sebagai anggota static: T.Zero untuk nilai nol, T.One untuk nilai satu, dan T.Abs untuk nilai mutlak.
Method Hitung Generik #
using System.Numerics;
public static T Jumlahkan<T>(List<T> daftarNilai) where T : INumber<T>
{
T total = T.Zero;
foreach (T nilai in daftarNilai)
{
total += nilai;
}
return total;
}
public static T HitungLuasPersegi<T>(T sisi) where T : INumber<T>
{
return sisi * sisi;
}
Console.WriteLine(Jumlahkan(new List<int> { 25000, 17500, 6000 }));
Console.WriteLine(Jumlahkan(new List<double> { 2.5, 3.5, 1.25 }));
Console.WriteLine(HitungLuasPersegi(6));
Console.WriteLine(HitungLuasPersegi(2.5));Output yang Dihasilkan:
48500
7.25
36
6.25Mari kita bedah baris demi baris:
using System.Numerics;: Namespace tempatINumber<T>dan keluarga interface numerik dideklarasikan.where T : INumber<T>: Type argument dijanjikan mendukung aritmetika penuh; inilah kunci yang memungkinkanTdipakai sebagai angka.T total = T.Zero;:Zeroadalah anggota static pada interface, jadi nol untukintdan0.0untukdoublediperoleh dari type parameter itu sendiri, bukan dari literal.total += nilai;: Operator+dijalankan lewatIAdditionOperators<T, T, T>; compiler mengenali operator padaTkarena constraint.return sisi * sisi;: Operator*berasal dariIMultiplyOperators<T, T, T>, sehingga luas persegi dihitung untuk tipe apa pun yang memenuhi constraint.- Empat panggilan di bawah: Method yang sama melayani int dan double tanpa satu pun overload tambahan.
Dengan INumber<T>, algoritma hitung ditulis satu kali dan berlaku untuk seluruh tipe numerik yang mengimplementasikannya.