本文實例講述了c#協變和逆變的原理及應用。分享給大家供大家參考。具體如下:
由子類向父類方向轉變是協變,用out關鍵字標識,由父類向子類方向轉變是逆變,用in關鍵字
協變和逆變的應用
一、 數組的協變
1、委托中的協變
//先聲明一個T為Animal的委托
Feed<Animal> feedAnimalMethod = a=>Console.WriteLine(“Feed animal lambda”);
//將T為Animal的委托賦值給T為Dog的委托變量,這是合法的,因為在定義泛型委托時有in關鍵字,如果把in關鍵字去掉,編譯器會認為不合法
Feed<Dog> feedDogMethod = feedAnimalMethod;
//接口的泛型T之前有一個in關鍵字,來表明這個泛型接口可能要做逆變
//如下泛型類型FeedImp<T>,實現上面的泛型接口;需要注意的是協變和逆變關鍵字in
public class FeedImp<T>:IFeedable<T>
{
public void Feed(T t){
Console.WriteLine(“Feed Animal”);
}
}
//使用接口逆變:
IFeedable<Dog> feedDog = new FeedImp<Animal>();
//上面的代碼將FeedImp<Animal>類型賦值給了IFeedable<Dog>的變量;Animal向Dog轉變了,所以是逆變
//泛型接口的泛型T之前用了out關鍵字來說明此接口是可能要做協變的;如下泛型接口實現類
public class Finder<T>:IFinder<T> where T:new()
{
public T Find(){
return new T();
}
}
//使用協變,IFinder的泛型類型是Animal,但是由于有out關鍵字,我可以將Finder<Dog>賦值給它
IFinder<Animal> finder = new Finder<Dog>();
希望本文所述對大家的C#程序設計有所幫助。
新聞熱點
疑難解答