当前位置:K88软件开发文章中心编程语言.NET.NET01 → 文章内容

C#4.0新特性:协变与逆变中的编程思想

减小字体 增大字体 作者:佚名  来源:翔宇亭IT乐园  发布时间:2018-12-31 11:55:20

方式都是不能通过编译的。

delegate TResult Fucntion<out T, TResult>(T arg);

delegate TResult Fucntionin TResult>(T arg);

说到这里,我想有人要问一个问题,既然输入表示逆变,输出表示协变,委托的输出参数应该定义成协变了?非也,实际上输出参数在这里既输出输出,也输出输入(毕竟调用的时候需要指定一个对应类型的对象)。也正是为此,输出参数的类型及不能定义成协变,也不能定义成逆变。所以下面两种变体的定义也是不能通过编译的。

delegate void Action<in T>(out T arg);

delegate void Action<out T>(out T arg);

虽然这里指介绍了关于委托的协变与逆变,上面提到的契约和输入/输出的关系也同样适用于基于接口的协变与逆变。你自己可以采用这样的方式去分析上面一部分我们定义的IGroup和IBrush。

5、逆变实现了“算法”的重用

实际上关系协变和逆变体现出来的编程思想,还有一种我比较推崇的说法,那就是:协变是继承的体现,而逆变体现的则是多态。实际上这与上面分析的契约关系本质上是一致的。

关于逆变,在这里请容我再啰嗦一句:逆变背后蕴藏的编程思想体现出了对算法的重用——我们为基类定义了一套操作,可以自动应用于所有子类的对象。

原文链接:http://www.cnblogs.com/artech/archive/2011/01/13/variance.html


上一页  [1] [2] 


C#4.0新特性:协变与逆变中的编程思想