AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

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

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

关注

评论

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

Java8异步编程-CompletableFuture,孔浩java视频百度云盘

Java 程序员 后端

hive学习笔记之七:内置函数,mybatis防止sql注入原理

Java 程序员 后端

IDEA 一键部署 SpringBoot 项目到远程服务器 Docker 内(1)

Java 程序员 后端

IDEA-2021首个大版本发布,Java开发者感动哭了(附新亮点演示

Java 程序员 后端

HTML笔记 —— 列表,和快手大佬的技术面谈

Java 程序员 后端

Jaeger知识点补充,mysqlsql优化视频教程百度网盘

Java 程序员 后端

Java SSM (springboot+mybatis)美食菜谱分享平台系统设计和实现以及论文报告

Java 程序员 后端

Java 新特性之泛型,kafka的架构图

Java 程序员 后端

Java 的大 Class 到底是什么?,吃透这份Java高级工程师面试497题解析

Java 程序员 后端

IDEA这样配置,好用到爆炸!(1),java基础入门第二版课后答案

Java 程序员 后端

IDEA这样配置,好用到爆炸!,金九银十怎么从中小企业挤进一线大厂

Java 程序员 后端

Java this关键字详解(3种用法),springaop实现原理面试题

Java 程序员 后端

Intellij IDEA神器那些让人爱不释手的小技巧,java高级程序员面试笔试

Java 程序员 后端

Java BSON使用,springboot运行原理理解

Java 程序员 后端

1个月连载30个设计模式真实案例(附源码),挑战年薪60W不是梦

Tom弹架构

Java 架构 设计模式

Java lambda表达式用法介绍,linux教程第四版思考题答案

Java 程序员 后端

hive学习笔记之三:内部表和外部表(1),贼好用的Java学习路线集合

Java 程序员 后端

hive学习笔记之八:Sqoop,大厂Offer拿到手软啊

Java 程序员 后端

HTTP-2做错了什么?刚刚辉煌2年就要被弃用了!,mybatis底层工作原理

Java 程序员 后端

jackson学习之八:常用方法注解,为什么阿里的程序员成长如此之快

Java 程序员 后端

Java 重写(Override)与重载(Overload),mysql基础语法大全

Java 程序员 后端

hive学习笔记之三:内部表和外部表,java面试手写算法

Java 程序员 后端

IDEA 一键部署 SpringBoot 项目到远程服务器 Docker 内

Java 程序员 后端

jackson学习之九:springboot整合(配置文件),jpa和mybatis的区别面试

Java 程序员 后端

Java IO,Java真实项目案例分享

Java 程序员 后端

Java 多线程 —— 同步代码块,给大家安排上

Java 程序员 后端

Java 必须掌握的 12 种 Spring 常用注解!你掌握了几种?

Java 程序员 后端

Java 线程池原理分析,java项目经理面试常见问题及答案

Java 程序员 后端

Helm部署的服务如何修改配置,nginx面试题负载均衡

Java 程序员 后端

hive学习笔记之九:基础UDF,java入门书籍下载

Java 程序员 后端

Java 世界里的垃圾回收规则你搞懂了吗?,java编程思想百度云

Java 程序员 后端

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