AICon 上海站|日程100%上线,解锁Al未来! 了解详情
写点什么

C# 7.1 先睹为快(第二部分)

  • 2017-06-12
  • 本文字数:1691 字

    阅读完需:约 6 分钟

天我们介绍了异步 Main 函数(Async Main)和默认表达式(Default Expressions)。我们的 C# 7.1 之旅将继续,今天要介绍的特性在建议中称为推导元组名(Infer Tuple Names)和使用泛型的模式匹配(Pattern-matching with Generics)。

推导元组名(Infer Tuple Names)

虽然开发人员不常考虑到,但是 C#中的匿名类型包括了命名推导。例如,编写如下代码时,对象 y 将具有名为 A 和 B 的属性:

复制代码
var y = new { x.A, x.B };

根据“推导元组名建议”,值元组基本具有同样的功能。

复制代码
var z1 = (A: x.A, B: x.B); // 显式名字。
var z2 = (x.A, x.B); // 推导名字。

但是匿名类型和值元组间存在着一些显著的差异:

  • 匿名类型需要属性名,属性明可以是显示指定的,也可以是推导得到的。
  • 值元组会将未命名属性标为 Item1、Item2 等。
  • 如果匿名类型具有重复的名字,那么会产生编译错误。
  • 如果值元组具有重复的显式名字,那么会产生编译错误。
  • 如果值元组具有重复的推导名字,那么推导名会被跳过。例如:(x.A, x.B, y.A) 将转化成 (Item1, B, Item3)。
  • 值元组不能使用如下保留名字:ToString、Rest、ItemN(N 是大于 0 的数字)。

C#和 VB 间有 hen 一个有意思的差别,VB 可以通过函数去推导匿名属性名。例如:

复制代码
var y = new { x.A, x.Bar() }; // 编译错误
Dim y = New With {x.A, x.Bar()} // 匿名类型{A,Bar}

该功能特性将扩展适用于 VB 元组。

但如果恰巧有一个扩展方法使用了与推导属性一样的名字,这一特性就会引发破坏性更改。在建议中进一步提出:

考虑到这一更改的破坏性有限,并且在 C# 7.0 中,交付元组的时间窗很短,兼容性委员会认为这种破坏性更改是可以接受的。

考虑泛型约束的元组名

如果存在元组名不匹配的问题,那么编译器会尽量警告编程人员。例如:

复制代码
public static (int A, int B) Test1((int A, int B) a)
Test1((A: 1, B: 2));
Test1((X: 1, Y: 2)); // 给出警告,元组名不匹配。

如果开始采用泛型约束,代码就不工作了:

复制代码
public static T Test2<t>(T a) where T : IEnumerable<(int A, int B)>
Test2(new List<(int A, int B)>());
Test2(new List<(int X, int Y)>()); // 没有警告。
</t>

当给出前的解释是,在泛型约束的条件下,编译器是不会去检查元组名的。理论上讲,编译器是可以捕获这类问题的,但是所付出的性能上的代价要远高于所得到的收益。

使用泛型的模式匹配

模式匹配是 C# 7.0 中新提供的特性。但是使用该特性时,存在设计上的缺陷。让我们看一下 Alex Wiese 给出的如下代码:

复制代码
class Program
{
static void Main(string[] args) {}
public void Send<t>(T packet) where T : Packet
{
if (packet is KeepalivePacket keepalive)
{
// 使用 keepalive 的功能代码。
}
switch (packet)
{
case KeepalivePacket keepalivePacket:
// 使用 keepalivePacket 的功能代码。
break;
}
}
}
public class Packet {}
public class KeepalivePacket : Packet {}
</t>

代码会报如下错误:“An expression of type T cannot be handled by a pattern of type KeepalivePacket.”。但如果我们将参数改为 System.Object 类型,而不是 T 类型,代码就工作正常了。

复制代码
public void Send(object packet)

C# 7.1,通过对引发模式匹配的规则进行微调,修正了这一问题。

我们改进了“模式匹配技术规范”中的一段内容,下面以粗体标出了我们所建议添加的内容:

我们认为左侧(left-hand-side)静态类型的特定组合与特定类型是不兼容的,这会导致编译时错误。我们称静态类型 E 的值与类型 T 是模式兼容的,如果存在标识转换(Identity Conversion)、隐式引用转换(Reference Conversion)、装箱转换(Boxing Conversion)、显式引用转换,或者存在从 E 到 T 的拆箱转换(Unboxing Conversion),或者 E 或 T 均为开放类型(Open Type)。如果具有类型 E 的表达式与其所匹配的类型模式中的类型并不模式兼容,就会产生编译时错误。

这被认为是一个软件问题修复问题。由于该更新是“向前不兼容”的,因此只有将编译器设为 C# 7.1,才能使用这一更新。

查看英文原文: An Early Look at C# 7.1: Part 2

2017-06-12 19:002462
用户头像

发布了 227 篇内容, 共 78.9 次阅读, 收获喜欢 28 次。

关注

评论

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

信创数据库有哪些?哪家好?堡垒机支持吗?

行云管家

数据库 信创 堡垒机 国产化

函数计算助力领健信息为“看牙”注入 AI 活力

阿里巴巴云原生

阿里云 云原生 函数计算

Kubernetes 事件日志采集与分析最佳实践

观测云

k8s

一文读懂3D实时云渲染!原理、优势、行业应用详解

点量实时云渲染

渲染 实时渲染 实时云渲染 3ds Max云渲染 3D实时云渲染

探索智慧服务新高度,2024 OPPO服务生态开发者沙龙在京举行

科技热闻

【前沿探索】|大模型在二进制安全领域中的应用

云起无垠

客户案例 I 中国头部智能电动车企利用流程智能平台健全和完善IPD体系

望繁信科技

数据挖掘 流程挖掘 汽车行业 流程智能 数字北极星

CyberScheduler架构引擎

数新网络官方账号

云时代下的呼叫中心:SD-WAN的推动作用

Ogcloud

SD-WAN SD-WAN组网 SD-WAN服务商 异地组网 SDWAN

深入理解PHP反射API的工作原理

技术冰糖葫芦

API Explorer API 接口 API 文档 pinduoduo API

SD-WAN技术怎样提升网络可靠性?

Ogcloud

SD-WAN 企业组网 SD-WAN组网 SD-WAN服务商 SDWAN

任务管理用什么工具?这款一站式软件助力敏捷团队精益化!

彭宏豪95

项目管理 职场 任务管理 在线白板 任务管理软件

inBuilder低代码平台新特性推荐-第十九期

inBuilder低代码平台

开源 低代码

一文搞懂RESTful开发

不在线第一只蜗牛

RESTful Rest

Apache Doris 2.0.10 版本正式发布

SelectDB

数据库 大数据 数据仓库 数据分析 Doris

低代码与数据分析可视化:构建数字化未来的双引擎

不在线第一只蜗牛

数据挖掘 数据分析 低代码

阿里巴巴中国站关键字搜索API返回值应用指南:电商营销新策略

技术冰糖葫芦

API boy API 接口 API 文档 pinduoduo API

2班-马千里-学习笔记

一马行千里

前端开发拥抱Vue3,优势何在?

珲少

ITBOOK 多得

C# 7.1先睹为快(第二部分)_.NET_Jonathan Allen_InfoQ精选文章