2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

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

关注

评论

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

阿里云Elasticsearch 企业级AI搜索方案发布

阿里云大数据AI技术

人工智能 elasticsearch 搜索 rag

聊一聊 Netty 数据搬运工 ByteBuf 体系的设计与实现

bin的技术小屋

Netty java netty netty内存管理

全球首发!昆仑万维重磅推出AI流媒体音乐平台Melodio

新消费日报

让生成式 AI 触手可及:火山引擎推出 NVIDIA NIM on VKE 最佳部署实践

极客天地

4家手机云电脑玩游戏:ToDesk云电脑、易腾云、达龙云、青椒云实测对比

小喵子

云电脑 云游戏 ToDesk ToDesk云电脑 云电竞

亚信安慧AntDB数据库与实在智能完成兼容性互认证,携手助力企业数据安全

亚信AntDB数据库

AntDB

望繁信科技邀您共赴2024数博会,开启数智经济新篇章

望繁信科技

大数据 数字化转型 流程挖掘 大数据博览会 流程智能

企业建设零信任体系的核心思路

芯盾时代

身份安全 iam 业务层 零信任模型

宠物供应链服务平台如何实现云化架构升级改造?

华为云开发者联盟

数据库 存储 企业号 8 月 PK 榜 企业号2024年8月PK榜

AI提问实现学习弯道超车!如何使用AI加速学习?

可信AI进展

人工智能

运维实战来了!如何构建适用于YashanDB的Prometheus Exporter

YashanDB

yashandb 崖山数据库 崖山DB

DeFi 协议应提供多类封装型比特币, wBTC 不应作为唯一选择

TechubNews

助力人效提升!火山引擎数智平台助推头部新能源车企业务增长

字节跳动数据平台

大数据 云服务 BI 数据可视化 物化视图

etl 读写 elastic 同步数据

weigeonlyyou

hadoop elastic HBase ETL Go 语言

什么是 OpenSSL?

NGINX开源社区

https TLS ssl 开源安全 openssl

2024-08-14:用go语言,给定两个长度分别为n和m的整数数组nums和changeIndices,下标从1开始。初始时,nums 中所有下标均未标记。 从第1秒到第m秒,每秒可以选择以下四种操

福大大架构师每日一题

福大大架构师每日一题

GreatSQL 并行Load Data加快数据导入

GreatSQL

LLM大模型部署实战指南:Ollama简化流程,OpenLLM灵活部署,LocalAI本地优化,Dify赋能应用开发

汀丶人工智能

人工智能 ollama localAI openllm

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