小编典典

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

all

这会导致编译时异常:

public sealed class ValidatesAttribute<T> : Attribute
{

}

[Validates<string>]
public static class StringValidation
{

}

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

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


阅读 93

收藏
2022-03-10

共1个答案

小编典典

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

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

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

编辑:Eric Lippert 的回答(释义):没有特别的原因,除了避免语言和编译器的复杂性用于一个不会增加太多价值的用例。

2022-03-10