在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;
轉自: https://blog.csdn.net/mykge/article/details/42918841