¿Por qué C# prohíbe los tipos de atributos genéricos?
Esto provoca una excepción en tiempo de compilación:
public sealed class ValidatesAttribute<T> : Attribute
{
}
[Validates<string>]
public static class StringValidation
{
}
Me doy cuenta de que C# no admite atributos genéricos. Sin embargo, después de mucho buscar en Google, parece que no puedo encontrar el motivo.
¿Alguien sabe por qué los tipos genéricos no pueden derivar de Attribute
? ¿Alguna teoría?
Bueno, no puedo responder por qué no está disponible, pero puedo confirmar que no es un problema de CLI. La especificación CLI no lo menciona (hasta donde puedo ver) y si usa IL directamente puede crear un atributo genérico. La parte de la especificación C# 3 que lo prohíbe (sección 10.1.4 "Especificación base de clase") no ofrece ninguna justificación.
La especificación ECMA C# 2 anotada tampoco proporciona ninguna información útil, aunque sí proporciona un ejemplo de lo que no está permitido.
Mi copia de la especificación C# 3 anotada debería llegar mañana... Veré si eso proporciona más información. De todos modos, definitivamente es una decisión de idioma más que de tiempo de ejecución.
EDITAR: Respuesta de Eric Lippert (parafraseado): no hay ningún motivo en particular, excepto para evitar la complejidad tanto en el lenguaje como en el compilador para un caso de uso que no agrega mucho valor.
Un atributo decora una clase en tiempo de compilación, pero una clase genérica no recibe su información de tipo final hasta el tiempo de ejecución. Dado que el atributo puede afectar la compilación, debe estar "completo" en el momento de la compilación.
Consulte este artículo de MSDN para obtener más información.