泛型委托的逆变和协变
泛型委托:委托实际只是提供了4个方法的一个类定义。这4个方法包括:一个构造器、一个Invoke方法、一个BeginInvoke方法和一个EndInvoke方法。如果定义的一个委托类型指定了类型参数,编译器会定义委托类的方法,用指定的类型参数替换方法的参数类型和返回值类型
利用逆变或者协变,可以将泛型委托类的一个变量转型为同一个委托类型的另一个变量,后者的泛型参数类型不同
不变量(invariant):泛型类型参数不能更改
逆变量(contravariant):泛型类型参数可以从一个基类更改为该类的派生类。在C#中用in关键字标记逆变量形式的泛型参数。逆变量泛型参数只出现在输入位置,比如作为方法的参数
协变量(covariant):泛型类型参数可以从一个派生类更改为它的基类。在C#中out关键字标记协变量形式的泛型参数。协变量泛型只能出现在输出位置,比如作为方法的返回类型
若定义如下委托类型:
public delegate TResut Func<in T, out TResult>(T arg)
声明一个变量如下:
Func<Object, ArgumentException> fn1 = null;
就可以将它转化成另一个泛型类型参数不同的Func类型:
Func<String, Exception> fn2 = fn1;

浙公网安备 33010602011771号