Ошибка компилятора CS0120 с текстом «для нестатического поля метода или свойства требуется ссылка на объект» возникает в момент сборки проекта, когда из статического контекста — например, из метода Main — идёт обращение к полю или методу класса без создания его экземпляра. Компилятор C# останавливает сборку и указывает строку, где имя члена класса использовано так, будто он статический, хотя объявлен обычным.

Эта ошибка — одна из самых частых у начинающих разработчиков на .NET, особенно в консольных приложениях, где точка входа static void Main() по определению статична. Разберём, почему она возникает, как её диагностировать и какие способы исправления подходят в разных ситуациях.

Что означает ошибка CS0120

В C# члены класса делятся на статические и нестатические (экземплярные). Статический член принадлежит самому классу и существует в единственном экземпляре на всё приложение. Нестатический член принадлежит конкретному объекту — и пока объект не создан через new, обращаться к его полям и методам не к чему.

Когда вы пишете MyClass.Counter = 5;, а поле Counter объявлено без модификатора static, компилятор не знает, к какому именно объекту относится присваивание. Объектов может быть тысяча — или ни одного. Поэтому он требует ссылку на объект: конкретную переменную, через которую станет ясно, с чьим полем работать.

Важно понимать: это ошибка времени компиляции, а не выполнения. Программа с таким кодом просто не соберётся, и исправлять её нужно в исходниках, а не в настройках проекта или среды.

Типичный код, вызывающий ошибку

Классический сценарий — обращение к экземплярному методу из статического Main:

class Program

{

int counter = 0;

void Increment()

{

counter++;

}

static void Main()

{

Increment(); // Ошибка CS0120

counter = 10; // Ошибка CS0120

}

}

Здесь и поле counter, и метод Increment() нестатические, а Main — статический по требованию платформы. Внутри статического метода нет неявного this, поэтому компилятор не может подставить ссылку на объект автоматически.

Похожая ситуация возникает и при обращении через имя класса из любого другого места: Program.Increment(); даст ту же ошибку, потому что синтаксис «класс.член» допустим только для статических членов.

📊 Где вы чаще всего встречаете ошибку CS0120?