В чем разница между ошибкой времени выполнения (Runtime error) и ошибкой компиляции (Compilation error) в C#?

«В чем разница между ошибкой времени выполнения (Runtime error) и ошибкой компиляции (Compilation error) в C#?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Эти ошибки возникают на разных этапах жизненного цикла программы и имеют разные причины и последствия.

Ошибка компиляции (Compilation Error)

  • Когда возникает: На этапе компиляции, когда компилятор C# (например, Roslyn) преобразует исходный код в промежуточный язык (IL).
  • Причина: Нарушение правил языка C#: синтаксические ошибки, несоответствие типов, отсутствие объявленных членов, нарушение правил области видимости.
  • Последствие: Исполняемый файл (.exe/.dll) не создаётся. Программа не может быть запущена.
  • Обнаружение: Компилятор явно указывает на ошибку с номером строки и описанием. Современные IDE (Visual Studio, Rider) подсвечивают их в реальном времени.
// Пример ошибки компиляции: несоответствие типов
int number = "Hello"; // CS0029: Cannot implicitly convert type 'string' to 'int'

// Пример: использование необъявленной переменной
Console.WriteLine(unknownVariable); // CS0103: The name 'unknownVariable' does not exist

Ошибка времени выполнения (Runtime Error)

  • Когда возникает: Во время выполнения уже скомпилированной программы.
  • Причина: Логические ошибки в программе или непредвиденные условия среды: деление на ноль, обращение к null, выход за границы массива, недостаток памяти, ошибки ввода-вывода.
  • Последствие: Программа аварийно завершается (крашится) или выбрасывает исключение (Exception), которое может быть перехвачено и обработано.
  • Обнаружение: Требует отладки (debugging), анализа стека вызовов и логирования.
// Пример ошибки времени выполнения: NullReferenceException
string text = null;
int length = text.Length; // System.NullReferenceException

// Пример: IndexOutOfRangeException
int[] numbers = { 1, 2, 3 };
int value = numbers[5]; // System.IndexOutOfRangeException

// Пример: DivideByZeroException
int a = 10, b = 0;
int result = a / b; // System.DivideByZeroException
Сравнение в таблице: Критерий Ошибка компиляции Ошибка времени выполнения
Время При компиляции При запуске программы
Причина Нарушение синтаксиса/правил C# Логическая ошибка или внешний сбой
Результат Нет исполняемого файла Исключение или краш программы
Исправление Обязательно, иначе код не запустится Может быть обработано в try-catch

Вывод: Ошибки компиляции — это «опечатки» языка, которые нужно исправить перед запуском. Ошибки времени выполнения — это логические дефекты программы, для поиска которых нужны тестирование и отладка.