Sí, se llamará al constructor estático una vez para cada tipo de clase cerrada (el tipo creado cuando se especifican los parámetros de tipo). Consulte C# 3 specification, §10.12 constructores estáticos.
El constructor estático para un tipo de clase cerrado se ejecuta como máximo una vez en un dominio de aplicación determinado.
y también:
Debido a que el constructor estático se ejecuta exactamente una vez para cada cerrados construidos tipo de clase, que es un lugar conveniente para hacer cumplir los controles de tiempo de ejecución en el parámetro de tipo que no puede ser consultado a las tiempo de compilación mediante restricciones (§10.1.5). Por ejemplo, el siguiente tipo utiliza un constructor estático para hacer valer el argumento de que tipo es una enumeración:
class Gen<T> where T: struct
{
static Gen() {
if (!typeof(T).IsEnum) {
throw new ArgumentException("T must be an enum");
}
}
}
También es relevante para leer §4.4.2 abierto y cerrado tipos:
En tiempo de ejecución, todo el código dentro de una declaración de tipo genérico se ejecuta en el contexto de un tipo construido cerrado que se creó aplicando argumentos de tipo a la declaración genérica. Cada parámetro de tipo dentro del tipo genérico está vinculado a un tipo de tiempo de ejecución particular. El procesamiento en tiempo de ejecución de todas las declaraciones y expresiones siempre ocurre con tipos cerrados, y los tipos abiertos ocurren solo durante el procesamiento en tiempo de compilación.
Cada tipo de construcción cerrada tiene su propio conjunto de variables estáticas, que no se comparten con ningún otro tipo de construcción cerrada.
Este programa que se puede ejecutar a sí mismo demuestra que el constructor estático se llama tres veces, no sólo una vez:
public class Program
{
class SomeGenericClass<T>
{
static SomeGenericClass()
{
Console.WriteLine(typeof(T));
}
}
class Baz { }
static void Main(string[] args)
{
SomeGenericClass<int> foo = new SomeGenericClass<int>();
SomeGenericClass<string> bar = new SomeGenericClass<string>();
SomeGenericClass<Baz> baz = new SomeGenericClass<Baz>();
}
}
Salida:
System.Int32
System.String
Program+Baz
¿Cómo es eso una clase estática? –
@Jouke van der Maas, ¿quién habló sobre una clase estática? La pregunta es sobre el constructor estático de una clase genérica, no una clase estática ... –
Esto no fue ninguno, así que todavía se aplica :) –