泛型委托的逆变和协变

泛型委托:委托实际只是提供了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;
posted @ 2012-08-15 22:04  HelloWorld.Michael  阅读(430)  评论(0)    收藏  举报