为什么C#不允许通用属性?

4
嗨!这个主题是一个副本:为什么C#禁止通用属性类型? 我正在密切关注Roslyn编译器,并注意到可以使用泛型类型作为属性。因此,我的问题是:有没有一个好的C#泛型属性的例子?
编辑:
事实证明,它们实际上是不允许的:
error CS0698: A generic type cannot derive from 'Attribute' because it is an attribute class

我的实际问题是:为什么会这样?

1
你需要一个例子来干什么?你认为什么样的例子是好的? - Chris
相反,从Attribute派生出一个通用类型是错误的:“通用类型不能从'Attribute'派生,因为它是一个属性类。” - Mike Zboray
只是出于好奇,我想不到什么情况下需要属性是泛型的,但似乎这是可能的。 - Trident D'Gao
@mikez 好消息,这意味着我可以忽略这个情况。 - Trident D'Gao
2
属性和构造函数参数值存储在程序集元数据中。这些值当然永远不可能是通用的。这使得属性仍然具有通用性几乎没有任何用途,我想不出来。 - Hans Passant
@Chris和其他看不出用处的人:例如,可以使用[Somthing<TheClass>("My text")]代替笨拙的[Somthing(typeof(TheClass), "My text")],这样会更酷。在这种情况下,还可以搜索封闭/构造类型SomethingAttribute<TheClass>的实例。当然,我们可以没有它而生活,但它并不是完全无用的。 - Jeppe Stig Nielsen
1个回答

5

ECMA-335(CustomAttribute,§II.22.10)中定义的属性的元数据表示不允许属性的构造函数引用MethodSpec签名,这意味着即使您可以声明一个泛型属性,您也永远无法使用它。

C#语言考虑到了这个限制。具体限制包含在§10.1.4.1 基类中(在§17 属性中没有重复)。


但是为什么你可以在启用了最新的Roslyn代码的LinqPad(版本6)中这样做呢?在.NET Fiddle中它不起作用... - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接