2012-08-08 16 views
10

Przy następujących klas:Dlaczego nie jest wywoływany konstruktor statyczny w klasie używanej jako ogólny parametr typu?

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>(); 
    } 
} 

wyjście jest

Foo is being referenced as a generic type parameter

Ma to sens, w zależności od specyfikacji:

Statyczny konstruktor nazywa się automatycznie zainicjować klasę przed pierwsza instancja jest tworzona lub odwoływane są jakiekolwiek statyczne elementy.

Ale jestem ciekawy, dlaczego konstruktor statyczny nie jest wywoływany, gdy typ jest odwoływany jako typowy parametr typu.

+0

Dobry kolega z pytaniem, ten jeden bit mnie dzisiaj –

Odpowiedz

6

Dlaczego miałaby być?

Punkt statycznego konstruktora wywoływanego normalnie polega na upewnieniu się, że stan skonfigurowany w konstruktorze statycznym został zainicjowany przed pierwszym użyciem.

Po prostu używając Foo jako argumentu typu nie korzysta z żadnego stanu w nim, więc nie ma potrzeby, aby wywołać statyczny konstruktor.

Możecie spróbować tworzenia statycznej zmiennej inicjator skutki uboczne (na przykład wywołanie metody, które następnie drukuje do konsoli) i usuwając statyczne konstruktora - że can affect the timing of initialization significantly w niektórych przypadkach. To może uruchomić tutaj.

+0

Tak wymyśliłem. Dziękuję za wyjaśnienia i link. – arootbeer

1

Dzieje się tak dlatego, że nie można używać treści typu w żaden znaczący sposób, po prostu przez włączenie jako typowy parametr, typ musi mieć coś zrobionego, aby zagwarantować wywołanie konstruktora statycznego.

Masz rację, że jest to zgodne ze specyfikacją. Sekcja 10.12 (Static Konstruktorzy) stwierdza:

Realizacja statycznym konstruktorze jest wywołany przez pierwszy z następujących zdarzeń występuje w domenie aplikacji:

· Instancja typu klasy jest stworzony.

Dowolny ze statycznych elementów typu klasy.

Jako ogólny parametr typu nie należy do żadnego z nich.

+0

Pytanie już potwierdza, że ​​zachowanie jest zgodne ze specyfikacją, ale pyta, dlaczego specyfikacja jest napisana tak, jak jest. – hvd

+0

@hvd Dzięki, tęskniłem za tym. Odpowiedź zmieniła się. –

0

Chodzi tu zauważyć, że w new Bar().ReferenceFooAsGenericTypeParameter<Foo>(); utworzeniu obiektu typu Bar, ani głównego ani Bar mają utworzyć instancję Foo ani nie ma żadnego z jego członków obejrzano w przypadku przedstawiona, sam typ jest jedynie przekazywany jako parametr.

Powiązane problemy