You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: standard/attributes.md
+9-4Lines changed: 9 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -16,14 +16,17 @@ Attributes are defined through the declaration of attribute classes ([§23.2](at
16
16
17
17
A class that derives from the abstract class `System.Attribute`, whether directly or indirectly, is an ***attribute class***. The declaration of an attribute class defines a new kind of attribute that can be placed on program entities. By convention, attribute classes are named with a suffix of `Attribute`. Uses of an attribute may either include or omit this suffix.
18
18
19
-
A genericclass declaration shall not use `System.Attribute`as a direct or indirect base class.
19
+
An attribute class may be generic. When an *attribute_name* references a generic attribute class, each type argument is subject to the same restrictions that apply to a type argument of the `typeof` operator ([§12.8.18](expressions.md#12818-the-typeof-operator)); for example, `dynamic`, a tuple type with element names, a nullable reference type, `nint`, and `nuint` are not permitted as type arguments. (In addition, a type parameter of the surrounding declaration shall not be used as a type argument; see §8.5.)
>publicclassC<T> : B {} // Error – generic cannot be an attribute
25
+
>usingSystem;
26
+
>publicclassAttr<T> : Attribute { } // OK – generic attribute class
27
+
>
28
+
> [Attr<int>] // OK
29
+
>publicclassC1 { }
27
30
> ```
28
31
>
29
32
>*endexample*
@@ -61,6 +64,8 @@ The attribute `AttributeUsage` ([§23.5.2](attributes.md#2352-the-attributeusage
61
64
62
65
`AttributeUsage` hasanamedparameter ([§23.2.3](attributes.md#2323-positional-and-named-parameters)), called `AllowMultiple`, whichindicateswhethertheattributecanbespecifiedmorethanoncefor a given entity. If `AllowMultiple` for an attribute class is true, then that attribute class is a ***multi-use attribute class***, and can be specified more than once on an entity. If `AllowMultiple` for an attribute class is false or it is unspecified, then that attribute class is a ***single-use attribute class***, and can be specified at most once on an entity.
63
66
67
+
> *Note*: For a generic attribute class, multiplicity is determined by the unbound generic attribute class definition, not by individual closed constructions. Therefore, when `AllowMultiple` is false or unspecified, two attribute applications that differ only in their type arguments shall not both appear on the same entity. *end note*
68
+
64
69
> *Example*: The following example defines a multi-use attribute class named `AuthorAttribute` and shows a class declaration with two uses of the `Author` attribute:
0 commit comments