今天講的內容有點多,但是差不多都能聽懂,稍微有點模糊的就是協變和逆變的概念,下面是我結合在網上看的資料整合而成的。
msdn上的原話:
協變:是指能夠使用比原始指定的派生類型的派生程度更小(不太確定)的類型
逆變:是指能夠使用比原始類型的派生類型的派生程度更大(更具體)的類型
在方便理解的概念是:
協變:子類向父類轉化,用于返回類型用out關鍵字
逆變:父類向子類轉化的過程,用于方法參數類型用in關鍵字
協變的例子:
1 public class Person { } 2 3 public class Student : Person { } 4 5 public delegate T MyDelegate<out T>(); 6 class PRogram 7 { 8 static void Main(string[] args) 9 {10 MyDelegate<Student> student = () => new Student();11 MyDelegate<Person> person = student;12 13 }14 }View Code
如果這里去掉out關鍵字就會報不能隱式轉化的錯誤
逆變的例子:
1 public class Person { } 2 3 public class Student : Person { } 4 5 public interface IFly<in T> { } 6 7 public class FlyImp<T> : IFly<T> { } 8 public delegate T MyDelegate<T>(T t); 9 class Program10 {11 static void Main(string[] args)12 {13 14 IFly<Person> peson = new FlyImp<Person>();15 IFly<Student> student = peson;16 }17 }View Code
如果這里IFly<in T>去掉in 后面也要報隱式轉換的錯誤哇,好神奇!
這里終于理解ms提供的2個委托:Action<in> 和Func<out> 里面的in和out的含義了。
通過簡單的了解后,有了協變和逆變后,以后寫代碼可以更靈活,當然這是廢話,在敲代碼的過程中,雖然簡單但是還浪費不少時間,也發現自己眼高手低的毛病,以后要多多實踐了。
新聞熱點
疑難解答