为什么不在用作泛型类型参数的类上调用静态构造函数?

aro*_*eer 11 c# generics static-constructor

鉴于以下课程:

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>();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是

Foo is being referenced as a generic type parameter

根据规范,这是有道理的:

在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数来初始化类.

但我很好奇为什么在将类型作为泛型类型参数引用时不调用静态构造函数.

Jon*_*eet 6

它为什么需要?

正常调用静态构造函数的要点是确保在静态构造函数中设置的任何状态在首次使用之前进行初始化.

仅仅使用Foo作为类型参数不会使用其中的任何状态,因此不需要调用静态构造函数.

您可能想尝试创建一个带有副作用的静态变量初始化程序(例如,然后打印到控制台的方法调用)并删除静态构造函数 - 这在某些情况下会显着影响初始化的时间.它可能在这里触发它.