AICon上海|与字节、阿里、腾讯等企业共同探索Agent 时代的落地应用 了解详情
写点什么

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

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

关注

评论

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

前端vue在可视化大屏领域的工作实践

孙叫兽

Vue 可视化 eCharts 可视化地图 引航计划

架构实战营模块5

阿体

react源码解析7.Fiber架构

全栈潇晨

react.js react源码

模块5-”微博评论“的高性能高可用计算架构

小遵

模块5作业

大肚皮狒狒

JVM之内存管理

邱学喆

JVM 内存管理 垃圾回收算法 垃圾回收器

Pandas之:Pandas高级教程以铁达尼号真实数据为例

程序那些事

Python 大数据 数据分析 pandas

用C语言实现interface

实力程序员

Proxy 对象简介

编程三昧

JavaScript 大前端 ES6 Proxy

架构模块5作业

高亮

架构训练营

架构实战营 模块五作业

Dylan

架构实战营

作业

CR

如何画好架构图 (建议收藏)

悟空聊架构

流程图 架构图 6月日更 processon 原理图

(技术型)产品经理打怪升级之路

菜根老谭

产品经理 职业转型

windows安装minikube的正确姿势

蛋先生DX

Docker k8s minikube 6月日更

给你一台服务器,你能把你写的代码部署到线上吗?

小傅哥

小傅哥 ssl 云部署搭建 博客配置 安装宝塔

设计微博系统中”微博评论“的高性能高可用计算架构

贯通

#架构实战营

模块5 学习总结

TH

架构实战营

模块五-微博评论高性能高可用计算架构

华仔架构训练营

支持边云协同终身学习特性,KubeEdge子项目Sedna 0.3.0版本发布!

华为云开发者联盟

机器学习 学习 kubeedge Sedna 边云协同

Webpack 系列4:彻底理解 module.issuer 属性

范文杰

webpack 6月日更

模块五:课后作业

黄先生

”微博评论“的高性能高可用计算架构

thewangzl

【Flutter 专题】110 页面间小跳转 (四)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 6月日更

架构实战营5 作业

梦寻解语花

架构实战营

从水晶宫到甲秀楼:在数博会读懂智慧城市的“大工业时代”

脑极体

【Vue2.x 源码学习】第六篇 - 数据代理的实现

Brave

源码 vue2 6月日更

模块5作业 微博评论高性能高可用计算架构

TH

架构实战营

架构实战营 模块五课后作业

iProcess

架构实战营

【LeetCode】目标和Java题解

Albert

算法 LeetCode 6月日更

模块五:课后作业

菲尼克斯

架构实战营

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