协变是指只要方法的返回类型派生于委托声明的返回类型所对应的类,该方法就可以赋值给委托;
逆变是指只要方法的参数类型是委托声明中指定的参数类型的基类,该方法就可以赋值给委托。
class X
{
public int Val;
}
class Y : X //Y派生于X
{
}
delegate X ChangeIt(Y obj);
class Program
{
static X IncrA(X obj)
{
X temp = new X();
temp.Val = obj.Val + 1;
return temp;
}
static Y IncrB(Y obj)
{
Y temp = new Y();
temp.Val = obj.Val + 1;
return temp;
}
static void Main(string[] args)
{
ChangeIt change = IncrA; // 逆变 IncrA()的参数类型是ChangeIt()的参数类型的基类
change = IncrB; //协变 IncrB()返回的Y派生于ChangeIt()的返回值类型
}
}