2012-08-08 11 views
10

Dadas las siguientes clases:¿Por qué no se invoca un constructor estático en una clase utilizada como parámetro de tipo genérico?

public class Foo { 
    static Foo() { 
     Console.WriteLine("Foo is being constructed"); 
    } 
} 

public class Bar { 
    public void ReferenceFooAsGenericTypeParameter<T>() { 
     Console.WriteLine("Foo is being referenced as a generic type parameter"); 
    } 
} 

public class SampleClass 
{ 
    public static void Main() 
    { 
     new Bar().ReferenceFooAsGenericTypeParameter<Foo>(); 
    } 
} 

la salida es

Foo is being referenced as a generic type parameter

Esto tiene sentido, de acuerdo con la especificación:

Un constructor estático es llamado automáticamente para inicializar la clase antes se crea la primera instancia o se hace referencia a cualquier miembro estático.

Pero tengo curiosidad de por qué el constructor estático no se invoca cuando se hace referencia al tipo como un parámetro de tipo genérico.

+0

Buena pregunta compañero, este me mordió hoy –

Respuesta

6

¿Por qué debería ser?

El punto del constructor estático que se llama normalmente es asegurarse de que cualquier estado configurado dentro del constructor estático se inicialice antes de que se use por primera vez.

El uso de Foo como argumento de tipo no hace uso de ningún estado dentro de él, por lo que no es necesario llamar al constructor estático.

Es posible que desee para tratar de crear un inicializador de variable estática con efectos secundarios (por ejemplo, una llamada a un método, que luego imprime en la consola) y retirar el constructor estático - que can affect the timing of initialization significantly en algunos casos. Es puede activarlo aquí.

+0

Me di cuenta de eso. Gracias por la aclaración y el enlace. – arootbeer

1

Eso es porque no se puede utilizar realmente el contenido de tipo de una manera significativa simplemente por la inclusión como un parámetro de tipo genérico, el tipo tiene que tener algo hecho a él para justificar un constructor estático que se llama.

Y tiene razón en que esto está en línea con la especificación. Sección 10.12 (estático Constructors) establece:

La ejecución de un constructor estático se desencadena por el primero de los siguientes eventos que se produzca dentro de un dominio aplicación:

· Una instancia del tipo de clase es creado.

· Se hace referencia a cualquiera de los miembros estáticos del tipo de clase.

uso como un parámetro de tipo genérico es ninguna de las dos.

+0

La pregunta ya reconoce que el comportamiento es de acuerdo con la especificación, pero pregunta por qué la especificación se escribe tal como es. – hvd

+0

@hvd Gracias, lo perdí. Respuesta cambiada –

0

Lo que hay que tener en cuenta es que, en new Bar().ReferenceFooAsGenericTypeParameter<Foo>(); que haya creado un objeto de tipo barra, ni el principal ni Bar tienen crear una instancia de Foo ni tiene ninguno de sus miembros ha accedido, en el caso presentado, la mecanografiar simplemente me pasa como un param.

Cuestiones relacionadas