为什么C#禁止泛型属性类型?
这会导致编译时异常:
public sealed class ValidatesAttribute<T> : Attribute
{
}
[Validates<string>]
public static class StringValidation
{
}
我意识到C#不支持通用属性。 但是,经过Google搜索之后,我似乎无法找到原因。
有谁知道为什么泛型类型不能从Attribute
派生? 任何理论?
那么,我无法回答为什么它不可用,但我可以确认它不是CLI问题。 CLI规范没有提及它(据我所知),如果直接使用IL,则可以创建一个通用属性。 C#3规范的禁止部分 - 第10.1.4节“类基本规范”没有给出任何理由。
注释的ECMA C#2规范也不提供任何有用的信息,尽管它提供了不允许的内容的示例。
我的注释C#3规范的副本应该明天到达...我会看看是否提供了更多信息。 无论如何,这绝对是一个语言决定,而不是一个运行时。
编辑:Eric Lippert的回答(释义):没有特别的理由,除了避免复杂的语言和编译器的用例不增加太多价值。
一个属性在编译时装饰一个类,但是泛型类直到运行时才会收到它的最终类型信息。 由于该属性会影响编译,因此编译时必须“完整”。
有关更多信息,请参阅此MSDN文章。
我不知道为什么它不被允许,但这是一种可能的解决方法
[AttributeUsage(AttributeTargets.Class)]
public class ClassDescriptionAttribute : Attribute
{
public ClassDescriptionAttribute(Type KeyDataType)
{
_KeyDataType = KeyDataType;
}
public Type KeyDataType
{
get { return _KeyDataType; }
}
private Type _KeyDataType;
}
[ClassDescriptionAttribute(typeof(string))]
class Program
{
....
}
链接地址: http://www.djcxy.com/p/49123.html