註意:無論【協變】還是【逆變】都能 保證類型安全 ...
註意:無論【協變】還是【逆變】都能 保證類型安全
1 static void Main(string[] args) 2 { 3 //==>【協變】:子類泛型賦值給父類泛型 (返回值的時候使用) 4 //前提是類型參數有 out 修飾:public interface IQueryable<out T> 5 IQueryable<string> a = null; 6 IQueryable<object> b = a; //這裡就是【協變】 7 8 //==>【逆變】:父類泛型賦值給子類泛型 (傳參數的時候使用) 9 //前提是類型參數有 in 修飾:public delegate void Action<in T>(T obj); 10 Action<object> c = null; 11 Action<string> d = c; //這裡就是【逆變】 12 d("target");//這一行是理解關鍵,註意實際是誰在使用"target"參數就能理解【逆變】 13 14 //==>【最後提醒一句】:像List<T>這樣的泛型類,由於聲明時沒有 in或out 修飾泛型參數,所以不存在【協變】和【逆變】 15 //public class List<T> 16 List<string> e = null; 17 List<object> f = e; //不存在【協變】,編譯時就會報錯 18 List<object> h = null; 19 List<string> i = h; //不存在【逆變】,編譯時就會報錯 20 }