Saya tidak mengerti mengapa kode C # berikut tidak dapat dikompilasi.
Seperti yang Anda lihat, saya memiliki metode generik statis Sesuatu dengan IEnumerable<T>
parameter (dan T
dibatasi menjadi IA
antarmuka), dan parameter ini tidak dapat dikonversi secara implisit IEnumerable<IA>
.
Apa penjelasannya? (Saya tidak mencari solusi, hanya untuk memahami mengapa itu tidak berhasil).
public interface IA { }
public interface IB : IA { }
public class CIA : IA { }
public class CIAD : CIA { }
public class CIB : IB { }
public class CIBD : CIB { }
public static class Test
{
public static IList<T> Something<T>(IEnumerable<T> foo) where T : IA
{
var bar = foo.ToList();
// All those calls are legal
Something2(new List<IA>());
Something2(new List<IB>());
Something2(new List<CIA>());
Something2(new List<CIAD>());
Something2(new List<CIB>());
Something2(new List<CIBD>());
Something2(bar.Cast<IA>());
// This call is illegal
Something2(bar);
return bar;
}
private static void Something2(IEnumerable<IA> foo)
{
}
}
Kesalahan saya Something2(bar)
mengantre:
Argumen 1: tidak dapat mengonversi dari 'System.Collections.Generic.List' menjadi 'System.Collections.Generic.IEnumerable'
T
jenis referensi. Jika Anda menggunakan kondisi tersebut where T: class, IA
maka itu harus bekerja. Jawaban terkait memiliki detail lebih lanjut.
Something2(foo);
secara langsung. Berkeliling .ToList()
untuk mendapatkan List<T>
( T
adalah parameter tipe Anda dideklarasikan dengan metode umum) tidak diperlukan untuk memahami ini (a List<T>
adalah an IEnumerable<T>
).