免费下载案例集|20+数字化领先企业人才培养实践经验 了解详情
写点什么

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

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

关注

评论

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

一周信创舆情观察(4.19~4.25)

统小信uos

干了八年的阿里面试官,给大家分享我面试时最爱问的Java面试题

Java架构师迁哥

uni-app rtc插件集成指南及常见问题--iOS

anyRTC开发者

uni-app ios 音视频 WebRTC RTC

高并发系列:架构优化之细说负载均衡

Coder的技术之路

负载均衡 高并发 高并发优化 负载均衡架构

5.1特辑|为何显示有票你却抢不到?技术揭秘12306如何保证车票不超卖

华为云开发者联盟

数据库 GaussDB(for Redis) 五一 12306 数据强一致性

华为云云原生数据库GaussDB加速创新,企业核心数据上云信赖之选

华为云开发者联盟

数据库 云原生 华为云 GaussDB(for openGauss) 全密态安全

站在车顶才能维权?中汽协基于区块链放“大招”!

CECBC

特斯拉

系统服务-技术专题-并发模型粗浅分析探讨

洛神灬殇

并发编程

领域驱动设计(DDD)在百度爱番番的实践

百度Geek说

中台 微服务 领域驱动设计DDD

区块链赋能的Web 3.0时代将是一番怎样的景象?

CECBC

区块链

从字节跳动到火山引擎(一) | Redis 云原生实践

redis 字节跳动 Kubernetes 云原生 火山引擎

击破行业痛点,区块链赋能智慧物流高速发展

CECBC

区块链

云图说|数据可视化管理,搭载数据安全黑科技!华为数据安全中心,助你保障云上数据安全!

华为云开发者联盟

数据安全 华为云 云图说 DSC 数据安全中心 云上数据

Rust从0到1-集合-Vector

rust 集合 Collections vecotr

跨湖跨仓场景下如何实现海量数据分钟级分析

华为云开发者联盟

大数据 数据湖 数据分析 华为云FusionInsight MRS HetuEngine

区块链技术赋能不动产登记,让群众办事更便利

CECBC

区块链

复习一周 成功拿到字节Offer 我也惊呆了

学Java关注我

Java 面试 程序人生 编程语言 计算机

基于 HLS 创建 Golang 视频流服务器

天黑黑

音视频 HLS 声网 Go 语言

anyRTC 音视频 uni 插件集成步骤

anyRTC开发者

uni-app android 音视频 WebRTC sdk

【Java面试】30个 Java 集合面试必备的问题和答案 ​

Java架构师迁哥

000 ES suggest-英文

小林-1025

es7

Android 设备音视频兼容性适配

网易云信

WebRTC

海南新场景!数字人民币在三亚完成首单离岛免税购物

CECBC

海口免税

江西组织部干部人事综合管理平台建设,干部管理系统

编曲混音必备法宝——FL三大效果器简介

奈奈的杂社

Kubernetes入门——Kubernetes实现应用的高可用

百度开发者中心

Kubernetes k8s入门 #技术课程#

本科学历,杭州工作4年,三个月学习入职阿里,薪资涨幅达到50%

比伯

Java 编程 程序员 架构 计算机

CrossOver for Mac 怎么用?

懒得勤快

行业洞察 | 风口上的互联网医疗,如何赢得下半场?

澳鹏Appen

人工智能 大数据 医疗方案 智能医疗 医疗AI

音频技术及行业的发展

Emotion

音频技术

阿里云 ARMS 3.0 重磅发布云拨测,Gartner APM 魔力象限产品解读

阿里巴巴中间件

阿里云 Gartner 可观测

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