《C#入门到精通》学习笔记 -- 逆变接口与协变接口
来源:互联网 发布:阿里云金牌合作伙伴 编辑:程序博客网 时间:2024/06/06 03:11
不是很懂,先转一片看似不错的博客。
http://www.cnblogs.com/luminji/archive/2010/09/12/1824487.html
本章概要:
1:协变与逆变概念
2:协变
3:逆变
4:注意事项
5:接口变体语法
1:逆变与协变概念
“协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型。
“逆变”则是指能够使用派生程度更小的类型。
如果泛型接口或委托的泛型参数声明为协变或逆变,则将该泛型接口或委托称为“变体”。
2:协变
查看下面代码:
IEnumerable<String> strings = new List<String>(); IEnumerable<Object> objects = strings;
在 .NET Framework 早期版本中,在 Option Strict On 条件下,此代码会导致 C# 和 Visual Basic 中出现编译错误。但是现在,您可以使用 strings 代替 objects,如上例所示,因为 IEnumerable<(Of <(T>)>) 接口为协变接口。
3:逆变
逆变允许方法具有与接口的泛型形参所指定的实参类型相比,派生程度更小的实参类型。为展示逆变功能,假设您已创建 BaseComparer 类来比较 BaseClass 类的实例。BaseComparer 类实现 IEqualityComparer<BaseClass>(在 Visual Basic 中为 IEqualityComparer(Of BaseClass))接口。因为 IEqualityComparer<(Of <(T>)>) 接口现在为逆变接口,所以您可以使用 BaseComparer 来比较继承 BaseClass 类的类的实例。以下代码示例中演示了这一点。
// Simple hierarchy of classes.class BaseClass { }class DerivedClass : BaseClass { }// Comparer class.class BaseComparer : IEqualityComparer<BaseClass> { public int GetHashCode(BaseClass baseInstance) { return baseInstance.GetHashCode(); } public bool Equals(BaseClass x, BaseClass y) { return x == y; }}class Program{ static void Test() { IEqualityComparer<BaseClass> baseComparer = new BaseComparer(); // Implicit conversion of IEqualityComparer<BaseClass> to // IEqualityComparer<DerivedClass>. IEqualityComparer<DerivedClass> childComparer = baseComparer; }}
4:注意事项
有引用类型才支持使用泛型接口中的变体。值类型不支持变体。 实现变体接口的类仍是固定类。例如,虽然 List<(Of <(T>)>) 实现协变接口 IEnumerable<(Of <(T>)>),但无法将 List<string>.
// The following line generates a compiler error// because classes are invariant.// List<Object> list = new List<String>();// You can use the interface object instead.IEnumerable<Object> listObjects = new List<String>();
5:接口变体语法
若要声明变体泛型接口,可以对泛型类型参数使用 in 和 out 关键字。
您可以使用 out 关键字,将泛型类型参数声明为协变。
您可以使用 in 关键字,将泛型类型参数声明为逆变。
- 《C#入门到精通》学习笔记 -- 逆变接口与协变接口
- 《C#入门到精通》学习笔记 -- 抽象类 与 接口
- 理解 C# 泛型接口中的协变与逆变(抗变)
- C#学习笔记-协变与逆变
- 《C#入门到精通》学习笔记 -- IEnumerable和IEnumberator接口
- 《C#入门到精通》学习笔记 -- 委托工厂与用户接口
- Scala入门到精通——第二十一节 类型参数(三)-协变与逆变
- Scala入门到精通——第二十一节 类型参数(三)-协变与逆变
- C#笔记16:协变与逆变
- .NET4.0,C#泛型接口的协变与抗变
- C#笔记 -- 协变、逆变
- C#笔记 -- 协变、逆变
- C#笔记 -- 协变、逆变
- scala入门:逆变与协变
- c#协变与逆变
- C#逆变与协变
- C#协变与逆变
- C#中的协变与逆变
- win_debug_linux
- jquery 插件大全
- Android免费课程整理
- 程序员_Java高新技术<三>代理
- CXf 创建webservice
- 《C#入门到精通》学习笔记 -- 逆变接口与协变接口
- Android有效解决加载大图片时内存溢出的问题
- 关键代码段实现线程同步
- 分享一个PHP采集远程图片
- 播放器歌词LRC
- 常用数据库语句
- 存图片和视频到iPhone相册
- awk常见用法
- jQuery中fadeIn、fadeOut、fadeTo的用法(图片隐藏与显示)