是否会为传递给泛型参数的每个类型运行泛型类上的静态构造函数,例如:
class SomeGenericClass<T>
{
static List<T> _someList;
static SomeGenericClass()
{
_someList = new List<T>();
}
}
Run Code Online (Sandbox Code Playgroud)
使用这种方法是否有任何缺点?
为了将泛型类型参数约束为枚举类型,我之前将它们限制为这样,这是我在C#7.3之前为枚举约束类型T的最佳方法:
void DoSomething<T>() where T : struct, IComparable, IConvertible, IFormattable
Run Code Online (Sandbox Code Playgroud)
现在,C#7.3添加了一个新功能来约束泛型类型System.Enum.我尝试使用今天发布的VS2017 15.7更新的枚举约束,并且当我这样写时它会成功编译(假设我有一个using System;指令):
void DoSomething<T>() where T : Enum
Run Code Online (Sandbox Code Playgroud)
但是,使用enum关键字不起作用并导致编译器抛出以下错误(后面有更多错误,期待一个方法体,但我猜这里并不值得一提):
void DoSomething<T>() where T : enum
^ error CS1031: Type expected
error CS1002: ; expected
^ error CS1001: Identifier expected
error CS1514: { expected
error CS1513: } expected
Run Code Online (Sandbox Code Playgroud)
由于有一个struct约束适用于结构,我不明白为什么enum这里不适用于枚举.这是真正的enum不映射到一个实际的类型一样int会为这样做Int32,但我认为它应该表现一样的struct约束.
我是否只是陷入了尚未完全实现的实验性特征陷阱,或者是否在规范中故意这样做(为什么?)?