最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

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:002177
用户头像

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

关注

评论

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

从浏览器地址栏输入url到显示页面的步骤

Augus

浏览器 9月日更

喜讯 | 拍乐云创始人赵加雨荣获「2021企业数智化转型升级先锋人物」奖

拍乐云Pano

音视频 数智化

J2PaaS低代码开源版,10月1号即将上线,企业数字化转型优选!

J2PaaS低代码平台

低代码 零代码 开发工具

拥抱云原生,华为云GaussDB全新助力金融行业数字化转型

华为云数据库小助手

GaussDB GaussDB(for openGauss) 华为云数据库

硬件Scrum指南

AmyGuo

Scrum 敏捷开发 硬件架构 硬件开发‘ 硬件敏捷

读懂Redis源码,我总结了这7点心得

Java redis 架构 面试 后端

2021西部云安全峰会召开:“云安全优才计划”发布,腾讯云安全攻防矩阵亮相

腾讯安全云鼎实验室

云安全 峰会

阿里资深架构师整理分享全套Java核心技术面试题及答案

Java 编程 架构 面试 程序人生

时间转换不在变bug

卢卡多多

时间戳 时间转换 9月日更

阿里藏经阁天花板:高性能Java架构核心原理手册,一定要偷偷看

Java 编程 架构 面试 程序人生

腾讯云TDSQL助力金融核心系统数字化转型

腾讯云数据库

数据库 tdsql

第4章-《Linux一学就会》- vim编辑器和恢复ext4下误删文件-Xmanager工具

学神来啦

vim Linux 运维 VI

人工智能、机器学习和数据工程 InfoQ 趋势报告 - 2021 年 8 月

Regan Yue

人工智能 9月日更 数据工程 趋势报告

设计千万级学生管理系统的考试试卷存储方案

缘分呐

架构设计实战

MyBatis Plus 批量数据插入功能,yyds!

王磊

mybatis springboot

被阿里奉为神册!2021公认最权威的分布式微服务指导手册

Java 架构 面试 程序人生 编程语言

地铁3D可视化,让一切尽在掌握

ThingJS数字孪生引擎

可视化

陌陌和它的解药,聊聊出海社交产品的思路

拍乐云Pano

社交APP出海 社交APP 泛娱乐出海

网络攻防学习笔记 Day148

穿过生命散发芬芳

等级保护 9月日更

腾讯云TDSQL-C云原生数据库技术

腾讯云数据库

数据库 tdsql

写给“后浪”们的职业生涯规划建议

轻口味

android 生涯规划 音视频 9月日更

考试试卷redis存储详细设计

小智

架构训练营

2021年金九银十必问的1000道Java面试题及答案整理

Java 架构 面试 程序人生 编程语言

TDSQL数据同步和备份

腾讯云数据库

数据库 tdsql

斯图飞腾Stratifyd亮相Smart Retail,AI赋能零售新增长

成为一名月薪2万的web安全工程师需要掌握哪些技能??

网络安全学海

黑客 网络安全 信息安全 渗透测试 WEB安全

阿里大牛再写传奇:并发原理JDK源码手册GitHub下载量已破百万

Java 编程 架构 面试 程序人生

java 虚拟机 GC 学习笔记三

风翱

GC 9月日更

2021中国规模化敏捷大会(早鸟票倒计时)

AmyGuo

DevOps 敏捷开发 Scrum精髓 硬件敏捷 规模化敏捷

力扣前400题解答笔记,全被字节大神整理到了这份文档里

Java 编程 架构 面试 程序人生

消息队列:Kafka Consumer源码解读

正向成长

kafka

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