猿问

为什么C#禁止泛型属性类型?

为什么C#禁止泛型属性类型?

这将导致编译时异常:

public sealed class ValidatesAttribute<T> : Attribute{}[Validates<string>]public static class StringValidation{}

我意识到C#不支持泛型属性。然而,在谷歌搜索了很多之后,我似乎找不到原因。

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


梦里花落0921
浏览 377回答 3
3回答

绝地无双

好吧,我不能回答为什么没有,但我.能,会,可以确认这不是CLI问题。CLI规范没有提到它(据我所见),如果您直接使用IL,您可以创建一个泛型属性。C#3规范中禁止它的部分-第10.1.4节“类基础规范”-没有给出任何理由。带注释的ECMA C#2规范也没有提供任何有用的信息,尽管它确实提供了一个不允许的示例。我的附加说明的C#3规范的副本明天就到了.我看看能不能提供更多的信息。无论如何,这肯定是语言决定,而不是运行时决定。编辑:EricLippert的回答:没有什么特别的原因,只是为了避免语言和编译器中的复杂性,因为用例并没有增加太多的价值。

潇潇雨雨

属性在编译时修饰类,但泛型类直到运行时才会接收其最终类型信息。因为属性会影响编译,所以它必须在编译时“完成”。看这个MSDN文章想了解更多信息。
随时随地看视频慕课网APP
我要回答