在类或方法的通用参数上放置属性是有效的(即编译并运行):
public class MyClass<[My] T>
{
private void MyMethod<[My] T>()
{}
}
public class MyAttribute : Attribute
{}
我从未见过这种用法,也很难想出为什么你会想要这样做。
这只是语言规范的一个怪癖/副作用,还是将属性放在这个位置有一个有效/有用的理由?
在类或方法的通用参数上放置属性是有效的(即编译并运行):
public class MyClass<[My] T>
{
private void MyMethod<[My] T>()
{}
}
public class MyAttribute : Attribute
{}
我从未见过这种用法,也很难想出为什么你会想要这样做。
这只是语言规范的一个怪癖/副作用,还是将属性放在这个位置有一个有效/有用的理由?
与任何结构一样,属性都有其用处;它们提供元数据,可供反射或其他后处理器使用以执行各种操作。例如,您可能拥有一个AOP系统,该系统使用类型参数上的属性来应用某些运行时约束,否则无法表达。我不确定是否有任何实际使用这些属性来执行任何操作的系统,但没有理由禁止它们作为元数据。
class MyComboBoxWithEnumValues<[EnumConstraint] TEnum>
比
if (!typeof(TEnum).IsEnum) throw new Exception(string.Format("{0} isn't an enumeration, stupid!", typeof(TEnum).FullName));
简单得多。 - Michael Hoffmann我相信某些AOP狂热者会找到使用属性装饰泛型参数的有效理由,但我确实想不出任何理由。试试这个:
typeof(MyClass<>).GetGenericArguments().GetCustomAttributes().OfType<MyAttribute>();
[out]
。 - H H