Start Debugging
2023-03-21 Aktualisiert 2023-11-05 csharp Edit on GitHub

C# 11 - Generische Attribute

Erfahren Sie, wie Sie generische Attribute in C# 11 definieren und nutzen, einschließlich Einschränkungen für Typargumente und gängiger Fehlermeldungen.

Endlich gibt es generische Attribute auch in C#! 🥳

Sie definieren eines genauso wie jede andere generische Klasse:

public class GenericAttribute<T> : Attribute { }

Und verwenden es wie jedes andere Attribut:

[GenericAttribute<string>]
public class MyClass { }

Einschränkungen für generische Attribute

Beim Anwenden des Attributs müssen alle generischen Typargumente angegeben werden. Mit anderen Worten: Das generische Attribut muss vollständig konstruiert sein.

Folgendes funktioniert beispielsweise nicht:

public class MyGenericType<T>
{
    [GenericAttribute<T>()]
    public string Foo { get; set; }
}

Typen, die Metadaten-Annotationen erfordern, sind als Typargumente generischer Attribute nicht zulässig. Sehen wir uns einige Beispiele für Unzulässiges und die Alternativen an:

Fehler

CS8968 ‘T’: an attribute type argument cannot use type parameters

Dieser Fehler bedeutet, dass Sie nicht alle Typargumente für Ihr Attribut angegeben haben. Generische Attribute müssen vollständig konstruiert sein, das heißt, Sie können beim Anwenden keine T-Parameter verwenden (siehe die Beispiele oben).

CS8970 Type ‘string’ cannot be used in this context because it cannot be represented in metadata.

Nullbare Referenztypen sind als Typparameter in generischen Attributen nicht erlaubt. Verwenden Sie string statt string?.

CS8970 Type ‘dynamic’ cannot be used in this context because it cannot be represented in metadata.

dynamic kann nicht als Typargument für ein generisches Attribut verwendet werden. Verwenden Sie stattdessen object.

CS8970 Type ‘(string foo, int bar)’ cannot be used in this context because it cannot be represented in metadata.

Tupel sind als Typparameter in generischen Attributen nicht erlaubt. Verwenden Sie stattdessen das äquivalente ValueTuple.

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Zurück