Saya memiliki kelas generik yang harus mengizinkan semua jenis, primitif atau sebaliknya. Satu-satunya masalah dengan ini adalah menggunakan default(T)
. Ketika Anda memanggil default pada tipe nilai atau string, itu menginisialisasinya ke nilai yang wajar (seperti string kosong). Saat Anda memanggil default(T)
suatu objek, ia mengembalikan null. Untuk berbagai alasan kita perlu memastikan bahwa jika ini bukan tipe primitif, maka kita akan memiliki contoh default dari tipe tersebut, bukan null. Ini percobaan 1:
T createDefault()
{
if(typeof(T).IsValueType)
{
return default(T);
}
else
{
return Activator.CreateInstance<T>();
}
}
Masalah - string bukanlah tipe nilai, tetapi tidak memiliki konstruktor tanpa parameter. Jadi, solusi saat ini adalah:
T createDefault()
{
if(typeof(T).IsValueType || typeof(T).FullName == "System.String")
{
return default(T);
}
else
{
return Activator.CreateInstance<T>();
}
}
Tapi ini terasa seperti lumpur. Apakah ada cara yang lebih baik untuk menangani kotak tali?