Вы можете определить статический конструктор на интерфейсе в .NET в IL.Однако, если вы это сделаете, статический конструктор не будет запущен при запуске метода в интерфейсе:
.method public static void Main() {
.entrypoint
.locals init ( class IInterface cls1 )
// InterfaceClass static constructor is run
newobj instance void InterfaceClass::.ctor()
stloc.0
ldloc.0
// IInterface static constructor is not run!!!!!
callvirt instance int32 IInterface::Method()
call void [mscorlib]System.Console::WriteLine(int32)
ret
}
.class public interface IInterface {
.method private static specialname rtspecialname void .cctor() {
ldstr "Interface static cctor"
call void [mscorlib]System.Console::WriteLine(string)
ret
}
.method public abstract virtual instance int32 Method() {}
}
.class public InterfaceClass implements IInterface {
.method private static specialname rtspecialname void .cctor() {
ldstr "Class static cctor"
call void [mscorlib]System.Console::WriteLine(string)
ret
}
.method public specialname rtspecialname instance void .ctor() {
ldarg.0
call instance void [mscorlib]System.Object::.ctor()
ret
}
.method public virtual instance int32 Method() {
ldc.i4.s 42
ret
}
}
Что здесь происходит?В спецификации CLR (Раздел II, 10.5.3.1) сказано, что когда выполняются инициализаторы типов, это указано в Разделе I, но я не могу найти никаких ссылок в Разделе I на выполнение инициализатора типов.
EDIT:
I может запустить статический интерфейс инициализации интерфейса, но только путем добавления статического поля к интерфейсу и доступа к этому полю где-то в коде, даже если поле фактически не назначено в статическомконструктор.Таким образом, кажется, что вызов метода в интерфейсе не заставляет работать статический конструктор, а делает доступ к полю.Почему это так?И где это упоминается в спецификации?