(泛型)变体:协变和逆变

更多
2020年04月09日 10点46分 作者:叶飞 修改

把委托赋值给委托

复习:泛型类还不是“类”。相同的泛型类,使用不同的类型参数,就是不同的类。

    Generic<Student> wpz = new Generic<Teacher>();

类型参数之间有继承关系呢?

    Generic<Person> wpz = new Generic<Teacher>();

还是不行,^_^


但是,观察以下代码:

            IEnumerable<string> names = new List<string> {"wf", "xr" };
            IEnumerable<object> students = names;
为什么不报错了?查看IEnuerable<T>的定义:
public interface IEnumerable<out T> : IEnumerable    //注意这个out

从.NET4.0开始,可以:

  • 声明(不是使用)
  • 泛型接口委托(也只能是接口和委托)时
  • 可以在类型参数添加(in或out)“变体”的指示

具体来说:

准确描述:一个类型参数声明了协变out(或逆变in)的泛型接口,用父类(或子类)做类型参数时,可以接受子类(或父类)做类型参数的实例。

注意,变体不能用于:

  • 泛型类和泛型方法
  • 值类型

为什么需要变体?

主要是为了让被定义的泛型接口和委托,可以有更广泛的应用。


参数都是in,输出都是out:

  • Action<in T>
  • Func<in T, out TResult>

@想一想@:为什么输入都是in,输出就是out?

当使用Action/Func时,传入的参数都是调用方提供的,可以比预期的“大”(父类对象),但不能小;反之亦然。

演示:回头看Average()


作业


C# 泛型 变体
赞: 61 踩: 0

打赏
已收到打赏的 帮帮币

你的 打赏 非常重要!
为了保证文章的质量,每一篇文章的发布,都已经消耗了作者 1 枚 帮帮币
没有“帮帮币”,作者无法发布新的文章。

全系列阅读
评论 / 0

后台开发


ADO和EF

如何通过C#进行数据库的读取,包含ADO.NET和Entity Framework相关知识……

其他:WebForm和WebApi

其他ASP.NET框架,如WebForm、WebApi……

RazorPages(Core)

微软推荐的、最新的、基于Razor页面和.NET core的新一代Web项目开发技术,包括Razor Tag Helper、Model绑定和Validation、Session/Cookie、内置依赖注入等……

MVC(Framework)

过去两年间最流行的、基于.NET Framework和MVC模式的ASP.NET MVC框架,主要用于讲解安全、性能、架构和各种实战功能演示……

C#语法

从入门的变量赋值、分支循环、到面向对象,以及更先进的语言特性,如:泛型、Lambda、Linq、异步方法等…………

Java语法

面向过程的变量赋值、分支循环和函数封装;面向对象的封装、继承和多态;以及更高阶的常用类库(集合/IO/多线程……)、lambda等

Java Web开发

SpringMVC

分层架构和综合实战

全部
关键字



帮助

反馈