为什么C#不允许泛型类型作为泛型类中的属性使用?

use*_*517 11 c# generics attributes

这不是一个非常重要的问题,我只是好奇为什么不允许这样做.该错误消息不是在解释有帮助的,因为很明显,"ATT" 从属性继承.

public class Generic<Att> where Att : System.Attribute
{
    [Att] //Error: 'Att' is not an attribute class
    public float number;
}
Run Code Online (Sandbox Code Playgroud)

Bac*_*cks 2

属性必须在编译时定义,只是因为它存储在 dll 或 exe 中。并且只能包含编译时创建的信息。因此,由于这个原因,它不能通用。

编译器经常使用属性类型或其值,因此您无法稍后定义它。

在您的示例中,您想使用通用参数标记字段:

public class Generic<Att> where Att : System.Attribute
{
    [Att] //Error: 'Att' is not an attribute class
    public float number;
}
Run Code Online (Sandbox Code Playgroud)

但它等于:

public class Generic<Att> where Att : System.Attribute
{
    [Attribute]
    public float number;
}
Run Code Online (Sandbox Code Playgroud)

因为Att以后无法更换。因此,没有理由对属性使用泛型。

  • 但泛型类型**是**编译时类型。 (6认同)
  • `[MyAttribute&lt;int&gt;]` 而不是 `[MyAttribute(typeof(int))]` 是一个明显的用例,这可以改进(某种程度上)语法。一些来源实际上将此功能列为 C# 8 中的可能性:[C# 8.0 - 新计划功能](https://www.dotnetcurry.com/csharp/1440/csharp-8-new-features) (2认同)