協變與逆變就是爲了在聲明一些接口的時候,可以增強他們的適用面
其中 out T 只能用於返回值泛型參數
in T 只能用於傳入參數
舉例說明
如 創建2個類
public class People
{
}
public class Chinese:People
{
}
List<People> PeopleList = new List<People>();
這樣調用,是絕對沒有問題的
但是這樣調用呢?你是不是會認爲 任何父類出現的地方都可以用子類來代替?
List<People> PeopleList1 = new List<Chinese>();
其實是不可以的,他們的類型變成了 ChinextList和PeopleList
爲了應對這種狀況,就需要用到協變與逆變
協變與逆變
協變
協變就是在需要傳入一個父級的泛型參數位置可以傳入一個子級,應用到out關鍵字 並且out關鍵字修飾的泛型參數 只能應用於返回值
定義一個接口一個類
public interface Iinterface<out T>
{
T Get();
}
public class NewClass<T> : Iinterface<T>
{
public T Get()
{
return default(T);
}
}
因爲用了out關鍵字 並且T是返回值 下面就可以通過Iinterface<People> people1=new NewClass<Chinese>();
逆變
逆變就是在一個需要傳入子級的泛型參數位置傳入一個父級,應用到關鍵字in 並且in關鍵字修飾的泛型參數 只能用於傳參使用
如下
public interface Iinterface<in T>
{
void Get(T t);
}
public class NewClass<T> : Iinterface<T>
{
public void Get(T t)
{
}
}
因爲用了in關鍵字 並且T是傳參使用 所以下面是通過的
Iinterface<Chinese> people1 = new NewClass<People>();
總結:
協變與逆變的作用是爲了在生命一些接口的時候可以增強他們的適用面
只適用於泛型
協變 應用到關鍵字out並且泛型T只能用於返回值 作用是可以在需要傳入父類的地方傳入子類
逆變 應用到關鍵字in並且泛型T只能用於傳參使用 作用是可以在需要傳入子類的地方傳入父類
通俗點理解就是 通過out和in關鍵字告訴系統,這裏我已經確認是沒有問題的,這些問題你就不需要考了了