【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

C# 8 新提案让泛型 Attribute 成为现实

  • 2019-01-28
  • 本文字数:955 字

    阅读完需:约 3 分钟

C# 8新提案让泛型Attribute成为现实

从一开始, Attribute 就是.NET 的一部分。因此,它们在引入泛型之前就已经被创建好,这意味着如果要引用属性中的类型,必须暴露一个 Type 参数或属性。例如:


[TypeConverter(typeof(X))]
复制代码


这种模式存在一些限制。在上面的示例中,X 必须有一个无参数的构造函数,并继承 TypeConverter。编译器不会强制这些,所以开发人员只能在运行时发现错误。


相反,如果我们使用泛型类型参数,那么就可以在编译器强制执行这些规则,而且语法会稍微清晰一些。


[TypeConverter<X>]
复制代码


理论上,“Allow Generic Attributes”提案是一个非常简单的变更。CLR 已经支持这个概念,问题是如何在.NET 语言中使用它。但有时候理论和现实是两条平行线,而且即使 CLR 可以支持,并不代表就一定会支持。Jan Kotas 解释说:


我认为这个问题的本质与局部引用和 return 类似。局部引用和 return 不受任何 API 的限制,理论上它们在现有的运行时、工具和库上都能正常运行。但在实际当中,它们可能不能正常运行,因为它们暴露了预先存在的错误和限制,可能是因为它们的处理路径从未被执行过,或者它们明显不在预期之内。与引用 return 相关的错误和问题刚刚开始出现,因为人们开始使用这项功能,并发现了一些不奏效的地方。我认为这在预期之内。我们应该承认这些事实,并且不会采取之前我们撤回默认值类型构造函数功能那样的行动。

这个功能非常类似。ECMA 并没有针对禁止使用泛型 Attribute 的内容,在理论上应该可以正常运行,但实际上却没有。如果要正常运行,必须更新整个系统中的很多部件:

  1. 存在多个运行时(Mono、CoreRT、整个框架);

  2. IL 的一些工具也可能会受到影响(编译器、基于 Cecil 或基于 CCI2 的工具);

  3. 可能需要用于访问泛型 Attribute 的 API(例如,现有的反射 API 不允许你访问泛型 Attribute——你必须进行枚举)。


该提案的一个限制是在编译时必须“关闭”Attribute 功能。下面是提案中提供的一个启用泛型 Attribute 的例子。


[SomeAttribute<T>]public void DoSomething<T>(T input) { }
复制代码


因为 T 不是在编译时定义的,因此反射机制就不知道这个表达式会返回什么。


typeof(GenericClass<>).GetMethod("DoSomething").GetCustomAttributes()
复制代码


状态


目前,泛型 Attribute 功能列在C# 8路线图中,状态为“进行中”。


查看英文原文https://www.infoq.com/news/2019/01/Generic-Attributes


2019-01-28 10:075130
用户头像

发布了 731 篇内容, 共 433.6 次阅读, 收获喜欢 1997 次。

关注

评论

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

吹爆!阿里高工携18位架构师耗时57天整合的1658页面试总结太香了

Java~~~

Java spring 架构 面试 JVM

FabEdge快速安装指南,极速上手体验边缘集群

BoCloud博云

边缘计算 博云开源 FabEdge 技术干货

Go- 闭包函数

HelloBug

简述 Linux I/O 原理及零拷贝(下) — 网络 I/O

Qunar技术沙龙

Linux TCP I/O DPDK 网络io

Go- defer

HelloBug

defer Go 语言 代码追踪 记录函数参数和返回值

高性能C++ HTTP客户端原理与实现

万俊峰Kevin

c++ workflow http client

解决生命科学研究痛点,北鲲云计算着力打造行业解决方案

北鲲云

Python Qt GUI设计:将UI文件转换为Python文件的三种妙招(基础篇—2)

不脱发的程序猿

Python qt GUI UI文件转换为Python文件

3 分钟了解 JSON Schema

程序员鱼皮

Java json 数据库 大前端 后端

Go- 可变参数函数

HelloBug

Go 语言 可变参数函数 空接口

又快又稳!Alibaba出品Java性能优化高级笔记(全彩版)震撼来袭

Java~~~

Java 架构 jdk 面试 JVM

画15张图搞定MySQL InnoDB工作原理

Java MySQL 数据库 程序员 后端

如何通过AI做智能化转型的一些思考

石云升

学习 AI 8月日更

智能语音技术:从哪儿来?往何处去?

安第斯智能云

深度学习 语音

可视化全埋点系列文章之功能介绍篇

神策技术社区

程序员 代码 埋点 神策数据

一个案例:论写作的重要性

非著名程序员

个人成长 写作 认知提升 8月日更

竟有阿里大牛用678页PDF只讲Java程序性能优化,除了干货就是干货

Java~~~

Java 架构 面试 JVM 调优

笔记-python面向对象

加里都好

架构实战营1期模块6作业——微服务架构

tt

架构实战营

元宇宙系统|NFT游戏系统技术开发

薇電13242772558

区块链

构建可靠分布式架构的最佳方式,竟记在国内第一本“凤凰架构”上

Java~~~

Java 架构 面试 JVM 架构师

neo4j 图数据库基础

escray

学习 neo4j 8月日更

Python代码阅读(第17篇):列表元素按位合并

Felix

Python 编程 Code Programing 阅读代码

按下数字化转型快进键!DataPipeline与星环大数据平台完成产品兼容互认证

DataPipeline数见科技

Go- 递归函数

HelloBug

递归 Go 语言

fil挖矿怎么挖?fil挖矿成本是多少?

fil挖矿怎么挖 fil挖矿成本是多少

5000字、12 连环炮、一张图快速搞定线程池

Java 架构 面试 后端 多线程

Apache APISIX 社区周报 | 2021 8.16-8.22

API7.ai 技术团队

Apache 开源 APISIX 社区 社区周报

腾讯WeTest压测大师通过中国计量科学研究院测试认证,获国家级权威认可

WeTest

Go- 函数执行时间

HelloBug

Go 语言 函数执行时间

网络上数据通信过程

一个大红包

8月日更

C# 8新提案让泛型Attribute成为现实_语言 & 开发_Jonathan Allen_InfoQ精选文章