自己在寫文章的同時,也是在學習,對於書中的語句很多其實沒有太好的理解,讀一本書,要消化!!!三章都是講泛型的,最後寫一下泛型的限制,對於本章學習的完結,one end,one begin.
看下面的代碼
1 public class Teacher 2 { 3 public enum Flag { Chinese, English }; 4 public string Name { get; set; } 5 } 6 7 public class ChineseTeacher : Teacher 8 { 9 Flag f = Flag.Chinese; 10 } 11 12 public class EnglishTeacher : Teacher 13 { 14 Flag f = Flag.English; 15 }
先來說下可變性,可變性分為協變性和逆變性。個人簡單地理解為協變性作用於返回類型時,返回的對象符合簽名中的返回類型,並進行向上轉換,如一個方法返回一個Teacher對象,這時我們可以返回一個EnglishTeacher對象,因為EnglishTeacher類是從Teacher類繼承的。或者簽名表明要返回一個接口,則可以返回一個實現該接口的類的實例。而對於逆變性,則作用於參數的轉遞,如果一個方法接受一個Teacher對象作為參數,那可以傳入一個ChineseTeacher對象。Teacher說我妥協了,你可以傳入一個實現或者繼承我的就行,不知理解是否正確,請指正。
1. 說下泛型吧,泛型不支持協變,如下面的代碼將出錯
1 List<Teacher> list = new List<ChineseTeacher> { 2 new ChineseTeacher(), 3 new EnglishTeacher() 4 };
list對象指向的是一個List<Teacher>列表,而在實際new的時候指向的是List<ChineseTeacher>列表,List<ChineseTeacher>到List<Teacher>,不知道能不能理解為協變?請指正。向一個List<ChineseTeacher>加入一個ChineseTeacher實例肯定是沒錯的,那向List<Teacher>加入一個EnglishTeacher對象肯定也是沒錯的,但向List<ChineseTeacher>加入一個EnglishTeacher對象肯定是不對,所以從上述的多義性可以看出泛型不支持協變性。
2.缺乏操作符約束或者"數值"約束
如我們在一個泛型方法中希望對泛型類實例進行操作符的運算是不起作用,且有BUG,在編譯時則報錯,而後續可以使用動態類型跳過編譯階段,等到執行階段再作決策。
------------------------------------------------------------------------------------------------------------------------------------
鑒於只說泛型可以文章篇幅過短,當然也知道文章在精不在多,說下沒有引用可空類型前,我們是如何表示一個"沒有值"的值。
1.放棄一個值,用這個值表示"沒有值",多人開發時,就好像指定errorCode:1表示服務器出錯、errorCode:2表示用戶不正確操作。
2.使用一個裝飾引用類型包含一個值,設置一個bool類型的標記
3.與值屬性相對的加入個bool類型的標記,與2的不同在於,3的方法在於在同一個類中,而2則是將值和標記封裝成類,在使用值的類中加入封閉後類的實例。
三種方式的缺點不言而喻,輸入過多的代碼,不能重復使用,基於這個C#引入了可空類型。
請斧正。