C#深入學習:泛型修飾符in,out、逆變委託型別和協變委託型別

時間不會說謊shane發表於2020-10-02

在C#中,存在兩個泛型修飾符:in和out,他們分別對應逆變委託和協變委託。

我們知道,在C#中要想將一個泛型物件轉換為另一個泛型物件時,必須要將一個泛型物件拆箱,對元素進行顯式或隱式轉換後重新裝箱。

例如:

List<Object> lobject=new List<Object>(){"0","1","2"};List<int> lint=new List<int>();foreach(Object obj in lobject){  lint.Add((int)obj);}

在這個拆箱和裝箱的過程中,要消耗掉相當於lobject物件兩倍的記憶體和資源,如果lobject物件非常大,這將是非常巨大的資源消耗。泛型修飾符就是用來解決這個問題的。

當兩個泛型物件的元素存在繼承關係是,可以在實現泛型物件是為泛型元素增加in或者out宣告,以便逆變或協變。

逆變泛型:

ListIn:IList<in T>
ListIn<Object> lobject = new ListIn<Object>(){"0","1","2"};
ListIn<int> lint=new ListIn<int>;
lint = lobject;

協變泛型:

ListOut:IList<out T>
ListOut<int> lint=new ListOut<int>(){0,1,2};
ListOut<Object> lobject=new ListOut<Object>();
lobject=lint;

相關文章