C# 抗變
要把泛型類型參數(shù)定義為抗變,可在類型定義中使用in關(guān)鍵字:
public interface IGrassMunchercin T>{ ... }
對(duì)于接口定義,抗變類型參數(shù)只能用作方法參數(shù),不能用作返回類型。
理解這一點(diǎn)的最佳方式是列舉一個(gè)在.NET Framework中使用抗變的例子。帶有抗變類型參數(shù)的一個(gè)接口是前面用過(guò)的IComparer<T>??梢越oAnimal實(shí)現(xiàn)這個(gè)接口,如下所示:
public class AnimalNameLengthComparer : IComparer<Animal>
{
public int Compare(Animal x, Animal y)
=> x.Name.Length.CompareTo(y.Name.Length);
}
這個(gè)比較器按名稱的長(zhǎng)度比較動(dòng)物,所以可使用它對(duì)List<Animal>的實(shí)例排序。通過(guò)抗變,還可以使用它對(duì)List<Cow>的實(shí)例排序,盡管List<Cow>.Sort()方法需要IComparer<Cow>的實(shí)例。
List<Cow> cov;s = new List<Cow> ();
cows.Add(new Cow("Rual"));
cows .Add (new SuperCow(" Donna"));
cows.Add(new Cow("Mary"));
cows.Add(new Cow("Ben"));
cows.Sort(new AnimalNameLengthComparer());
大多數(shù)情況下,抗變都會(huì)發(fā)生—它被添加到.NETFramework中就是為了幫助執(zhí)行這種操作。
點(diǎn)擊加載更多評(píng)論>>