Гарантия состоит в том, что статическое поле инициализируется до того, как вы получите к нему доступ. (А также, если есть статический конструктор, то все статические поля будут инициализированы до запуска статического конструктора.)
Для универсальных классов статическая инициализация работает для каждого типа, поэтому Container<int>
действует так, как будто это совершенно другой класс, чем Container<double>
. Это действительно верно для всех статических частей универсального класса - каждый тип получает свою собственную копию.
Пример покажет эту последнюю точку более четко:
static class Foo<T>
{
static int count = 0;
public static int Increment()
{
return ++count;
}
}
public class Program
{
public static void Main()
{
Console.WriteLine(Foo<int>.Increment());
Console.WriteLine(Foo<int>.Increment());
Console.WriteLine(Foo<double>.Increment());
}
}
Выход:
1
2
1