Ieri Giancarlo mi ha chiesto via mail:
"Ho sempre avuto un dubbio... Perchè nella definizione di una interfaccia non c'è la possibilità di specificare anche una firma per eventuali costruttori?"
Gli rispondo qui per togliere eventualmente anche ad altri lo stesso dubbio.
Partiamo da Richter, p. 326 (come si deve):
"Il linguaggio CLR consente alle interfacce di contenere costruttori static.
CLR non consente alle interfacce di contenere alcun costruttore di istanza."
e da questo banale snippet "Foo.cs":
interface IFoo{void NonUnCostruttore();}
Lo compiliamo:
csc /t:library Foo.cs
per ottenere il codice IL:
ildasm Foo.dll /out=Foo.il
Il metodo NonUnCostruttore avrà questa dichiarazione in IL:
.method public hidebysig newslot abstract virtual instance void NonUnCostruttore() cil managed
Con l'aiuto del libro di Serge Lidin, scopriamo le modifiche che dobbiamo fare per "trasformare" il metodo NonUnCostruttore in un costruttore static:
"Class constructors are static, have specialname and rtspecialname flags, have neither parameters nor return value—that is, the return type is void—and have the name .cctor, which in ILAsm is a keyword rather than a name."
Modifichiamo di conseguenza la dichiarazione di sopra:
.method public hidebysig newslot abstract virtual static specialname rtspecialname void .cctor() cil managed
e ricompiliamo:
ilasm /DLL Foo.il
Nell'output dell'IL Assembler, queste due righe dovrebbero toglierci i dubbi:
Assembled method IFoo::.cctor
Operation completed successfully