一尘不染

为什么C#禁止使用通用属性类型?

c#

这会导致编译时异常:

public sealed class ValidatesAttribute<T> : Attribute
{

}

[Validates<string>]
public static class StringValidation
{

}

我意识到C#不支持通用属性。但是,经过大量谷歌搜索之后,我似乎找不到原因。

有谁知道为什么泛型类型不能衍生自Attribute?有什么理论吗?


阅读 230

收藏
2020-05-19

共1个答案

一尘不染

好吧,我无法回答为什么它不可用,但是我 可以
确认这不是CLI问题。CLI规范没有提到它(据我所知),如果直接使用IL,则可以创建一个通用属性。C#3规范禁止该部分的部分-第10.1.4节“类基本规范”没有给出任何理由。

带注释的ECMA C#2规范也没有提供任何有用的信息,尽管它提供了不允许使用的示例。

带注释的C#3规范的副本应于明天到达…我将看看是否能提供更多信息。无论如何,这绝对是语言决定,而不是运行时决定。

编辑:埃里克·利珀特(Eric Lippert)的回答(释义):没有特殊的原因,除了在用例中避免增加语言和编译器的复杂性之外,这并没有增加太多价值。

2020-05-19