写点什么

.NET 泛型中的协变与逆变

  • 2008-08-29
  • 本文字数:825 字

    阅读完需:约 3 分钟

当前.NET 语言如 VB 和 C#还不支持泛型的协变(covariance)与逆变(contravariance)。尽管微软中的很多人也在谈论它,但是在不远的将来这还是不太可能出现。对协变与逆变的完整介绍要花很长时间。基于此,请大家参考 Eric Lippert 的关于C#中的协变与逆变的系列文章。为了在VB 中增加协变与逆变的泛型支持,Lucian Wischik 提出了下面的语法。

类型参数可由关键字“In”和“Out”修饰。“In”类型只能作为方法参数。与此类似,“Out”类型只能作为方法的返回类型。

使用Out 类型的一个例子就是IEnumerable(Of T)。如果某函数接受一个IEnumerable(Of Animal) 类型参数,那么我们就可以给它传一个IEnumerable(of Bird)。对于In 类型,一个不太恰当的例子就是顺序。看一下下面的接口:

<pre id="np7-15">Interface IWriter(Of T)<br id="np7-16"></br> Write(value As T)如果你向接受 Writer(Of Animal) 类型参数的函数传一个 IWriter(Of Bird),当然就不对了。该方法可以将 Animal 的任何子类传给 IWriter.Write,但是它只接受 Birds。

如果使用注解,该接口看起来像下面这样:

<pre id="np7-19">Interface IEnumerable(Of Out T)<p>Interface IWriter(Of In T)</p>这是针对 VB 编写的,它也可以用在 C#上。

<pre id="np7-23">interface IEnumerable<out T><p>interface IWriter<in T> </p><br id="ku3p"></br>不幸的是,这种语法并不能直接应用在大多数常见的场景中。比如 IList(Of T),当传给一个向集合中写入的方法时,T 应该是 In 类型。但是当传给一个从集合中读取的方法时,T 应该是 Out 类型。或许这里应该针对 IList 创建一个基类,该类会将接受 T 与返回 T 的方法区分开来。

追溯过去,C#和 VB 都支持数组协变(out/IEnumerable 情况),尽管在逆变的情况下这会导致运行时错误(in/IWriter 情况)。这样做的目的是使 C#更兼容于 Java。大多数人都认为这是一个不好的设计,但是现在却无法改变了。

查看英文原文: Covariance and Contravariance in .NET Generics

2008-08-29 01:311581
用户头像

发布了 88 篇内容, 共 273.0 次阅读, 收获喜欢 9 次。

关注

评论

发布
暂无评论
发现更多内容

HarmonyOS开发实战:在车机系统的分布式实践

yimapingchuan

HarmonyOS NEXT

鸿蒙开发实战:构建车机安全系统UI界面

yimapingchuan

HarmonyOS NEXT

HarmonyOS开发实战:Core Speech Kit在新闻应用的语音交互实现

chengxujianke

HarmonyOS NEXT

HarmonyOS开发实战:Neural Network Runtime Kit加速新闻AI推理

chengxujianke

HarmonyOS NEXT

HarmonyOS开发笔记:实现车机安全后台监控

yimapingchuan

HarmonyOS NEXT

鸿蒙开发实战:IME Kit实现新闻应用智能输入体验

chengxujianke

HarmonyOS NEXT

鸿蒙开发实战:Localization Kit实现新闻应用全球化适配

chengxujianke

HarmonyOS NEXT

HarmonyOS开发实战:HiAI Foundation Kit赋能新闻应用智能推荐

chengxujianke

HarmonyOS NEXT

鸿蒙应用开发:实现车机安全系统多语言适配

yimapingchuan

HarmonyOS NEXT

HarmonyOS开发实战:打造车机安全系统交互界面

yimapingchuan

HarmonyOS NEXT

鸿蒙开发实战:ArkWeb实现新闻应用内嵌浏览器优化

chengxujianke

HarmonyOS NEXT

HarmonyOS开发实战:UI Design Kit打造新闻应用沉浸式体验

chengxujianke

HarmonyOS NEXT

鸿蒙应用开发:实现车机安全日志安全存储

yimapingchuan

HarmonyOS NEXT

HarmonyOS开发实战:MindSpore Lite Kit优化新闻推荐模型推理

chengxujianke

HarmonyOS NEXT

鸿蒙开发笔记:Natural Language Kit实现新闻智能语义分析

chengxujianke

HarmonyOS NEXT

鸿蒙开发笔记:在车载安全系统数据持久化的高效实践

yimapingchuan

HarmonyOS NEXT

HarmonyOS开发实战:Background Tasks Kit实现新闻数据后台同步

chengxujianke

HarmonyOS NEXT

HarmonyOS开发实战:Form Kit实现新闻桌面卡片功能

chengxujianke

HarmonyOS NEXT

鸿蒙容器组件 Row 全解析:水平布局技术与多端适配指南

谢道韫

HarmonyOS开发实战:实现车机卡片式快捷控制

yimapingchuan

HarmonyOS NEXT

鸿蒙开发笔记:实现车机语音安全系统

yimapingchuan

HarmonyOS NEXT

鸿蒙开发笔记:Core Vision Kit在新闻应用的图像识别实践

chengxujianke

HarmonyOS NEXT

鸿蒙应用开发:Intents Kit实现新闻应用智能跳转

chengxujianke

HarmonyOS NEXT

鸿蒙容器组件 RelativeContainer 全解析:灵活定位的布局神器

谢道韫

鸿蒙应用开发:实现车机无障碍交互

yimapingchuan

HarmonyOS NEXT

鸿蒙开发实战:构建车机安全系统控制面板

yimapingchuan

HarmonyOS NEXT

HarmonyOS开发日记:在车机浏览器中的深度应用

yimapingchuan

HarmonyOS NEXT

鸿蒙开发笔记:实现车机安全输入方案

yimapingchuan

HarmonyOS NEXT

HarmonyOS开发实战:实现车机跨进程安全通信

yimapingchuan

HarmonyOS NEXT

鸿蒙开发实战:Core File Kit实现新闻离线缓存管理

chengxujianke

HarmonyOS NEXT

HarmonyOS开发实战:IPC Kit实现新闻应用跨进程通信优化

chengxujianke

HarmonyOS NEXT

.NET泛型中的协变与逆变_.NET_Jonathan Allen_InfoQ精选文章