在泛型参数上有什么用途?

adr*_*nks 17 .net c# generics attributes

它是有效的(即它编译并运行)将属性放在类或方法的泛型参数上:

public class MyClass<[My] T>
{
    private void MyMethod<[My] T>()
    {}
}

public class MyAttribute : Attribute
{}
Run Code Online (Sandbox Code Playgroud)

我从来没有见过这种情况,并且正在努力想出一个你为什么要这么做的理由.

它只是语言规范的怪癖/副作用,还是有一个有效/有用的理由将属性置于这个位置?

Dan*_*ant 13

出于同样的原因,属性对任何构造都有用; 他们提供的元数据可以被Reflection或其他后处理器用来做各种事情.例如,您可能有一个AOP系统使用类型参数上的属性来应用某些运行时约束,否则这些约束将无法表达.我不确定是否有任何系统实际使用这些属性做任何事情,但没有理由不允许它们作为元数据.

  • adrianbanks:Dan的答案是准确的.例如,我曾经编写过一个工具,用[DelegateConstraint]或[EnumConstraint]处理泛型参数,将其约束更改为Delegate或Enum,以克服C#限制. (4认同)