您的位置:首页 > 编程语言 > ASP

asp.net 泛型的 协变与逆变

2016-12-23 11:45 190 查看
协变与逆变就是为了在声明一些接口的时候,可以增强他们的适用面

其中 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关键字告诉系统,这里我已经确认是没有问题的,这些问题你就不需要考了了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: