Ieri per tutto il giorno vi ho parlato dell'articolo di Nicu G. Fruja in cui porta alla luce "a few gaps and mistakes in the C# reference manual, inconsistencies with different implementations of C#". Gli ho scritto chiedendogli dei commenti su "The reference of the static field B.x triggers only the initialization of A" e oggi mi ha risposto così (traduco dal rumeno):
Le specifiche affermano erroneamente che:
(17.11) "The execution of a static constructor is triggered by the first of the following events to occur within an application domain:
- An instance of the class is created.
- Any of the static members of the class are referenced."
Si può notare anche da questo esempio: il campo x è un campo della classe B, ma non dichiarato nella classe B, bensì nella classe A. In realtà, le specifiche dovrebbero dire così: l'accesso a un campo statico provoca l'inizializzazione della classe che l'ha dichiarato (nel nostro caso A).
Nicu ha ragione, perché secondo le specifiche x è un membro (anche) della classe B ma l'accesso a B.x non richiama il costruttore di tipo della classe B, bensì il costruttore di tipo della classe in cui x è stato dichiarato, cioè A.