Перейти к содержимому
Теория · Первая программа · урок 4 из 7

Ошибки компиляции

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

В первой строке этой программы забыли точку с запятой:

C#
Console.WriteLine("Hello") // ✗
Console.WriteLine("Bye");
TEXT
error CS1002: ; expected

Это ошибка компиляции: компилятор нашёл нарушение правил языка и отказался переводить текст. Программа не запустилась, поэтому не напечаталось ничего — ни Hello, ни даже Bye, хотя вторая строка написана верно. Корректор вернул рецепт целиком, и на кухне не выполнили ни одного шага.

Сообщение компилятора

Целиком сообщение об этой ошибке выглядит так: hello.cs(1,27): error CS1002: ; expected. Вместо hello.cs компилятор печатает полный путь к файлу, а здесь для краткости оставлено только имя.

Давайте разберём сообщение по частям, слева направо:

  1. hello.cs — файл, в котором нашлась ошибка.
  2. (1,27) — номер строки и номер символа в ней. В первой строке 27-й символ стоит сразу после закрывающей скобки: там компилятор и ждал точку с запятой.
  3. error — это ошибка, и программа не запустится.
  4. CS1002 — код ошибки. По нему ошибку можно найти в документации Microsoft.
  5. ; expected — что нарушено: ожидалась точка с запятой.

В курсе сообщения компилятора приведены по-английски. На компьютере с русским интерфейсом .NET может напечатать их по-русски, например error CS1002: Требуется ";"., но код ошибки не меняется: по нему сообщения и сверяют.

Если ошибок несколько, компилятор перечисляет их по одной на строку. Исправляйте их сверху вниз: следующие ошибки часто появляются из-за первой и исчезают вместе с ней. Под списком ошибок команда dotnet run просит исправить их и запустить программу снова.

Регистр букв

C# различает большие и маленькие буквы. Console, console и CONSOLE для него три разных имени, и знает он только первое. Поэтому одна неверная буква — уже ошибка компиляции:

C#
Console.WriteLine("Start");
Console.Writeline("Finish"); // ✗
TEXT
error CS0117: 'Console' does not contain a definition for 'Writeline'

Компилятор сообщает, что у Console нет действия Writeline: есть только WriteLine с большой L. Если написать console вместо Console, ошибка будет другой, CS0103: такого имени компилятор не знает вообще. В обоих случаях программа не запустится, и Start тоже не напечатается.

Ошибки и предупреждения

Кроме ошибок, компилятор C# выдаёт предупреждения. Ошибки и предупреждения различаются тем, что происходит с программой:

  • ошибка, строка со словом error, останавливает компиляцию, и программа не запускается;
  • предупреждение, строка со словом warning, программу не останавливает: она компилируется и запускается, но компилятор отметил подозрительное место.

Предупреждение похоже на пометку корректора на полях «проверьте»: рецепт уходит на кухню, но в нём, возможно, ошибка по смыслу. Поэтому предупреждения тоже читают и исправляют, а все примеры курса компилируются без них.

Частая ошибка

Забыли закрывающую кавычку:

C#
Console.WriteLine("Hello); // ✗
Console.WriteLine("Bye");
TEXT
error CS1010: Newline in constant
error CS1003: Syntax error, ',' expected
error CS1026: ) expected

Ошибка одна, а сообщений три. Давайте разберём, откуда они взялись:

  1. Литерал начался с кавычки перед Hello и не закрылся до конца строки. Об этом первая ошибка: внутри литерала встретился перевод строки.
  2. Скобка, точка с запятой и даже // ✗ оказались внутри литерала, поэтому вызов WriteLine не закрыт.
  3. Компилятор решил, что вызов продолжается на второй строке. Он ждёт запятую перед следующим значением (CS1003) и закрывающую скобку (CS1026).

Допишите кавычку после Hello, и вместе с первой ошибкой исчезнут две остальные.

Главное

  • Ошибка компиляции останавливает программу до запуска: не выполняется ни одна строка, даже верная.
  • Сообщение называет файл, строку и символ, код ошибки и что нарушено: hello.cs(1,27): error CS1002: ; expected.
  • C# различает большие и маленькие буквы: Writeline вместо WriteLine и console вместо Console — ошибки компиляции.
  • Ошибки исправляют сверху вниз; предупреждение не мешает запуску, но его тоже читают.