近来经常涉及泛型委托及接口的协变与逆变的问题,在网上搜索的时候,人们都是在反复地强调协变和逆变的概念,强调什么时候要加关键字 out,什么时候要加 in。可是鲜有人去说明:为何协变要加 out,为什么逆变就必须要加 in。下面我就在文章中稍作一下解释,可能解释有不妥的地方,欢迎指正。
首先说说协变,以泛型委托中的协变举例:
class Animal { public int LegNum = 2; }
class Dog : Animal { }
delegate T Del<out T>(); // 注意这个委托,签名中没有 T ,返回中有。
class Program
{
public static Dog Method() { return new Dog(); }
static void Main()
{
aDog = Method;