asp.net 泛型的 协变与逆变
2016-12-23 11:45
190 查看
协变与逆变就是为了在声明一些接口的时候,可以增强他们的适用面
其中 out T 只能用于返回值泛型参数
in T 只能用于传入参数
举例说明
如 创建2个类
但是这样调用呢?你是不是会认为 任何父类出现的地方都可以用子类来代替?
其实是不可以的,他们的类型变成了 ChinextList和PeopleList
为了应对这种状况,就需要用到协变与逆变
协变与逆变
协变
协变就是在需要传入一个父级的泛型参数位置可以传入一个子级,应用到out关键字 并且out关键字修饰的泛型参数 只能应用于返回值
定义一个接口一个类
逆变
逆变就是在一个需要传入子级的泛型参数位置传入一个父级,应用到关键字in 并且in关键字修饰的泛型参数 只能用于传参使用
如下
因为用了in关键字 并且T是传参使用 所以下面是通过的
总结:
协变与逆变的作用是为了在生命一些接口的时候可以增强他们的适用面
只适用于泛型
协变 应用到关键字out并且泛型T只能用于返回值 作用是可以在需要传入父类的地方传入子类
逆变 应用到关键字in并且泛型T只能用于传参使用 作用是可以在需要传入子类的地方传入父类
通俗点理解就是 通过out和in关键字告诉系统,这里我已经确认是没有问题的,这些问题你就不需要考了了
其中 out T 只能用于返回值泛型参数
in T 只能用于传入参数
举例说明
如 创建2个类
public class People { } public class Chinese:People { }
List<People> PeopleList = new List<People>();这样调用,是绝对没有问题的
但是这样调用呢?你是不是会认为 任何父类出现的地方都可以用子类来代替?
List<People> PeopleList1 = new List<Chinese>();
其实是不可以的,他们的类型变成了 ChinextList和PeopleList
为了应对这种状况,就需要用到协变与逆变
协变与逆变
协变
协变就是在需要传入一个父级的泛型参数位置可以传入一个子级,应用到out关键字 并且out关键字修饰的泛型参数 只能应用于返回值
定义一个接口一个类
public interface Iinterface<out T> { T Get(); } public class NewClass<T> : Iinterface<T> { public T Get() { return default(T); } }因为用了out关键字 并且T是返回值 下面就可以通过
Iinterface<People> people1=new NewClass<Chinese>();
逆变
逆变就是在一个需要传入子级的泛型参数位置传入一个父级,应用到关键字in 并且in关键字修饰的泛型参数 只能用于传参使用
如下
public interface Iinterface<in T> { void Get(T t); } public class NewClass<T> : Iinterface<T> { public void Get(T t) { } }
因为用了in关键字 并且T是传参使用 所以下面是通过的
Iinterface<Chinese> people1 = new NewClass<People>();
总结:
协变与逆变的作用是为了在生命一些接口的时候可以增强他们的适用面
只适用于泛型
协变 应用到关键字out并且泛型T只能用于返回值 作用是可以在需要传入父类的地方传入子类
逆变 应用到关键字in并且泛型T只能用于传参使用 作用是可以在需要传入子类的地方传入父类
通俗点理解就是 通过out和in关键字告诉系统,这里我已经确认是没有问题的,这些问题你就不需要考了了
相关文章推荐
- asp.net泛型集合学习
- Nhibernate 同 asp.net ,泛型,单元测试的最佳实践(同文章里的内容)
- ASP.NET通过反射获取泛型列表,从而节省代码量
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(7):服务器端和客户端数据类型的自动转换:泛型集合类型
- ASP.NET Repeater控件绑定List泛型的写法
- Nhibernate 同 asp.net ,泛型,单元测试的最佳实践
- asp.net mvc2.0 model 中包含泛型的字段的处理
- asp.net泛型实例
- ASP.NET:小编浅谈泛型的使用
- asp.net泛型技巧-打造可复用的抽象工厂
- c#4.0泛型接口和泛型委托的协变和逆变
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(7):服务器端和客户端数据类型的自动转换:泛型集合类型
- Asp.net MVC、Extjs(运用Linq to SQL和List泛型)批量更新、删除、打印(使用CKEditor)、导出Excel
- <转>C# 4.0 为泛型编程引入了 协变 和 逆变 支持,这是个不错的福利,能省掉以往的一些麻烦。不过当前(Beta2)仅支持泛型接口和泛型委托。
- asp.net ajax客户端编程+jquery:实现泛型数据的客户端数据调用、添加、删除
- ASP.NET:通过反射填充泛型集合List的静态方法
- ASP.NET MVC: 用db4o来做TempDataProvider(另附一个泛型的RedirectToAction方法)
- c#4.0——泛型委托的协变、逆变
- ASP.NET泛型类型转换
- asp.net mvc2.0 model 中包含泛型的字段的处理