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

sha*_*oth 13 c# generics static-variables

在C#中我有一个泛型类:

public class MyGeneric<ParameterClass> where ParameterClass: MyGenericParameterClass, new() {
    public static int Variable;
}
Run Code Online (Sandbox Code Playgroud)

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

MyGeneric.Variable = 1; // invalid in C++
Run Code Online (Sandbox Code Playgroud)

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

我想澄清一下......

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

Hab*_*bib 15

ECMA C#语言规范的第25.1.4节

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

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

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

MyGeneric.Variable = 1;
Run Code Online (Sandbox Code Playgroud)

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

class C<V>
{
    static int count = 0;
    public C()
    {
        count++;
    }
    public static int Count
    {
        get { return count; }
    }
}
class Application
{
    static void Main()
    {
        C<int> x1 = new C<int>();
        Console.WriteLine(C<int>.Count);  // Prints 1 
        C<double> x2 = new C<double>();
        Console.WriteLine(C<double>.Count); // Prints 1 
        Console.WriteLine(C<int>.Count);  // Prints 1 
        C<int> x3 = new C<int>();
        Console.WriteLine(C<int>.Count);  // Prints 2 
    }
}
Run Code Online (Sandbox Code Playgroud)


Mic*_*sen 6

MyGeneric<MyClass>.Variable
MyGeneric<MyOther>.Variable
Run Code Online (Sandbox Code Playgroud)

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