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

C# 11 - Atributos genéricos

Aprende a definir y usar atributos genéricos en C# 11, incluyendo las restricciones sobre los argumentos de tipo y los mensajes de error más comunes.

¡Por fin, los atributos genéricos son una realidad en C#! 🥳

Puedes definir uno igual que cualquier otra clase genérica:

public class GenericAttribute<T> : Attribute { }

Y usarlo igual que cualquier otro atributo:

[GenericAttribute<string>]
public class MyClass { }

Restricciones de los atributos genéricos

Al aplicar el atributo, deben proporcionarse todos los argumentos de tipo genérico. En otras palabras, el atributo genérico debe estar totalmente construido.

Por ejemplo, esto no funcionará:

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

Los tipos que requieren anotaciones de metadatos no se permiten como argumentos de tipo de un atributo genérico. Veamos algunos ejemplos de lo que no está permitido y sus alternativas:

Errores

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

Este error significa que no has especificado todos los argumentos de tipo para tu atributo. Los atributos genéricos deben estar totalmente construidos, lo que significa que no puedes usar parámetros T al aplicarlos (véanse los ejemplos anteriores).

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

Los tipos de referencia anulables no se permiten como parámetros de tipo en atributos genéricos. Usa string en lugar de string?.

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

dynamic no se puede usar como argumento de tipo para un atributo genérico. Usa object en su lugar.

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

Las tuplas no se permiten como parámetro de tipo en atributos genéricos. Usa el ValueTuple equivalente en su lugar.

Comments

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

< Volver