Ничто не получает память во время компиляции.Статические поля действительно помещаются в статический блок памяти, когда тип инициализируется.Стеки вызовов для статических методов распределяются во время выполнения точно так же, как в случае методов экземпляра.
Теперь, почему статические методы не имеют доступа к полям экземпляра.Учтите это:
class A {
public int Value;
static int GetValue() {
return Value;
}
}
Там у вас есть класс с полем экземпляра и статическим методом.Теперь, где-то еще вы попробуете это:
var a1 = new A();
a1.Value = 5;
var a2 = new A();
a2.Value = 10;
int result = A.GetValue();
Теперь, если компилятор это допустит, какое значение получит результат?5 или 10 или что-то еще?Это просто не имеет смысла, потому что статические методы объявлены для класса в целом и не знают экземпляров этого класса.Таким образом, в коде статического метода вы не знаете, сколько (если таковые имеются) экземпляры этого класса существуют и не можете получить доступ к их полям экземпляров.
Надеюсь, это имеет смысл.