協(xié)變性
interface IRetrivevWraper<out T>
{
? ? T GetData();
}
只要存在從類型A到類型B的有效轉(zhuǎn)換,或者類型A派生自類型B,就可以將IRetrieveWrappter<A>對象賦給
IRetrieveWrapper<B>引用避咆。
注意:
只有作為方法返回類型指定的類型參數(shù)才能使用out限定符苇倡。
只有接口和委托類型才能聲明為協(xié)變量掂墓。不能為泛型類使用out修飾符。
逆變性
public interface ICompare<in T>
{
? ? int Compare(T x, T y);
}
in關(guān)鍵字明確告訴C#編譯器:程序員要么傳遞T作為方的參數(shù)類型,要么傳遞T的派生類型纯露。程序員不能將T用作任何方法的返回類型促脉。
難點(diǎn)
協(xié)變:IRetrieveWrapper<object> = stringWrapper;//存在string到object的有效轉(zhuǎn)換辰斋,所以可以將IRetrieveWrapper<string>對象賦值給IRetrieveWrapper<object>引用策州。
逆變:IComparer<string> stringComparator = objectComparer;//逆變是作為參數(shù)存在的,因?yàn)閟tring中存在object中存在的屬性和方法宫仗,所以ICompare<object>可以賦值給IComparer<String>引用够挂。