所有C#generics实例都是常见的静态成员变量吗?

在C#中我有一个generics类:

public class MyGeneric where ParameterClass: MyGenericParameterClass, new() { public static int Variable; } 

现在在C ++中如果我实例化一个带有不同参数的模板化类,每个完整的类都会得到它自己的Variable ,所以我就是说不出来

 MyGeneric.Variable = 1; // invalid in C++ 

在C ++中,但似乎我可以在C#中这样做。

我想澄清一下……

如果我有一个带有静态成员变量的generics,那个变量是否在所有generics实例之间共享?

ECMA C#语言规范的第25.1.4节

generics类声明中的静态变量在相同的闭合构造类型(第26.5.2节)的所有实例之间共享,但不在不同的闭合构造类型的实例之间共享。 无论静态变量的类型是否涉及任何类型参数,这些规则都适用。

您可能会看到此博客文章: Gus Perez 在generics类中的静态字段

你也不能在C#中做到这一点。

 MyGeneric.Variable = 1; 

请考虑ECMA语言规范中的以下示例。

 class C { static int count = 0; public C() { count++; } public static int Count { get { return count; } } } class Application { static void Main() { C x1 = new C(); Console.WriteLine(C.Count); // Prints 1 C x2 = new C(); Console.WriteLine(C.Count); // Prints 1 Console.WriteLine(C.Count); // Prints 1 C x3 = new C(); Console.WriteLine(C.Count); // Prints 2 } } 
 MyGeneric.Variable MyGeneric.Variable 

这两个是不同的静态变量,像单独的类一样处理。

不,它不是共享的。

MyGeneric的每种可能性,每个MyGeneric类将解析为不同的运行时类型。

请检查没有带有Variable静态成员的非genericsMyGeneric类。

不它不是。 通用类型可以是“打开”或“关闭”。 开放类型就像List ,其中未定义类型参数; List是一个封闭类型。

本质上,运行时不将open类型视为正确的“Type” – 只有封闭版本才是真正的类型。 因此, MyGenericMyGeneric是两种完全不同的类型,因此拥有自己的静态变量实例。

由于您无法按照建议的方式调用静态成员,因此更加明显: MyGeneric.Variable将无法在C#中编译。

此控制台应用程序代码非常简单地说明了

 class Program { static void Main(string[] args) { Test.i = 2; Test.i = 8; Console.WriteLine(Test.i); // would write "8" if the fields were shared Console.WriteLine(Test.i); // Console.WriteLine(Test.i); // does not compile // Console.WriteLine(Test<>.i); // does not compile } } class Test { public static int i; }