这不是一个非常重要的问题,我只是好奇为什么不允许。错误信息并没有很好地解释,因为显然 "Att" 确实从 "Attribute" 继承。
public class Generic<Att> where Att : System.Attribute
{
[Att] //Error: 'Att' is not an attribute class
public float number;
}
这不是一个非常重要的问题,我只是好奇为什么不允许。错误信息并没有很好地解释,因为显然 "Att" 确实从 "Attribute" 继承。
public class Generic<Att> where Att : System.Attribute
{
[Att] //Error: 'Att' is not an attribute class
public float number;
}
属性必须仅在编译时定义,因为它存储在dll或exe中。并且只能包含编译时创建的信息。因此,出于这个原因,它不能是通用的。
编译器通常使用属性类型或其值,因此您无法稍后定义它。
在您的示例中,您想使用通用参数标记字段:
public class Generic<Att> where Att : System.Attribute
{
[Att] //Error: 'Att' is not an attribute class
public float number;
}
但是它等价于:
public class Generic<Att> where Att : System.Attribute
{
[Attribute]
public float number;
}
Att
,所以没有理由在属性中使用泛型。[MyAttribute<int>]
而不是 [MyAttribute(typeof(int))]
是一个明显的使用案例,这可以改善(在某种程度上)语法。实际上,一些来源将此功能列为 C# 8 中的可能性:C# 8.0 - 新计划功能。 - InBetween
Generic<OnlyAllowedOnMethodsAttribute>
。 - bommelding[MyAttribute<int>]
和[MyAttribute(typeof(int))]
一样可以在编译时解决。另一个问题是是否真的值得实现这个语法糖。 - InBetween