Ho tre classi, Base
, Derived
e Final
. Derived
deriva da Base
e Final
deriva da Derived
. Tutte e tre le classi hanno un costruttore statico. Classe Derived
come metodo statico pubblico chiamato Setup
. Quando chiamo Final.Setup
, mi aspetto che tutti e tre i costruttori statici vengano eseguiti, ma solo quello in Derived
viene eseguito.Perché non tutti i costruttori statici chiamati in C# (ad esempio quelli delle classi parent)?
Ecco il codice sorgente di esempio:
abstract class Base
{
static Base()
{
System.Console.WriteLine ("Base");
}
}
abstract class Derived : Base
{
static Derived()
{
System.Console.WriteLine ("Derived");
}
public static void Setup()
{
System.Console.WriteLine ("Setup");
}
}
sealed class Final : Derived
{
static Final()
{
System.Console.WriteLine ("Final");
}
}
Questo rende solo parzialmente senso per me. Capisco che chiamare Final.Setup()
sia in realtà solo un alias per Derived.Setup()
, quindi saltare il costruttore statico in Final
sembra abbastanza equo. Tuttavia, perché non viene chiamato il costruttore statico di Base
?
Posso risolvere questo problema chiamando un metodo statico non operativo di Base
o accedendo a qualche metodo statico fittizio di Base
. Ma mi stavo chiedendo: qual è il ragionamento dietro questo comportamento apparentemente strano?
http://msdn.microsoft.com/en-us/library/k9x6w0hc(v=vs.80).aspx – Cipi
Correlati, non un dup: http://stackoverflow.com/questions/6390960/c- costruttore-statico-non-chiamato-da-derivato-classe – Abel