IEnumerable<T>
adalah co-varian tetapi tidak mendukung tipe nilai, hanya tipe referensi saja. Kode sederhana di bawah ini berhasil dikompilasi:
IEnumerable<string> strList = new List<string>();
IEnumerable<object> objList = strList;
Tetapi mengubah dari string
menjadi int
akan mendapatkan kesalahan yang dikompilasi:
IEnumerable<int> intList = new List<int>();
IEnumerable<object> objList = intList;
Alasannya dijelaskan dalam MSDN :
Varians hanya berlaku untuk tipe referensi; jika Anda menentukan tipe nilai untuk parameter tipe varian, parameter tipe itu tidak tetap untuk tipe konstruksi yang dihasilkan.
Saya telah mencari dan menemukan bahwa beberapa pertanyaan menyebutkan alasannya adalah tinju antara tipe nilai dan tipe referensi . Tapi itu masih belum menjernihkan pikiran saya mengapa tinju adalah alasannya?
Bisakah seseorang tolong berikan penjelasan yang sederhana dan terperinci mengapa kovarians dan contravariance tidak mendukung tipe nilai dan bagaimana tinju mempengaruhi ini?