Ошибки компиляции
В первом уроке компилятор был строгим корректором: он читает рецепт целиком и не пускает на кухню текст с ошибкой. Теперь посмотрим, как выглядят его пометки на полях и как их читать.
В первой строке этой программы забыли точку с запятой:
Console.WriteLine("Hello") // ✗
Console.WriteLine("Bye");error CS1002: ; expectedЭто ошибка компиляции: компилятор нашёл нарушение правил языка и отказался переводить текст. Программа не запустилась, поэтому не напечаталось ничего — ни Hello, ни даже Bye, хотя вторая строка написана верно. Корректор вернул рецепт целиком, и на кухне не выполнили ни одного шага.
Сообщение компилятора
Целиком сообщение об этой ошибке выглядит так: hello.cs(1,27): error CS1002: ; expected. Вместо hello.cs компилятор печатает полный путь к файлу, а здесь для краткости оставлено только имя.
Давайте разберём сообщение по частям, слева направо:
hello.cs— файл, в котором нашлась ошибка.(1,27)— номер строки и номер символа в ней. В первой строке 27-й символ стоит сразу после закрывающей скобки: там компилятор и ждал точку с запятой.error— это ошибка, и программа не запустится.CS1002— код ошибки. По нему ошибку можно найти в документации Microsoft.; expected— что нарушено: ожидалась точка с запятой.
В курсе сообщения компилятора приведены по-английски. На компьютере с русским интерфейсом .NET может напечатать их по-русски, например error CS1002: Требуется ";"., но код ошибки не меняется: по нему сообщения и сверяют.
Если ошибок несколько, компилятор перечисляет их по одной на строку. Исправляйте их сверху вниз: следующие ошибки часто появляются из-за первой и исчезают вместе с ней. Под списком ошибок команда dotnet run просит исправить их и запустить программу снова.
Регистр букв
C# различает большие и маленькие буквы. Console, console и CONSOLE для него три разных имени, и знает он только первое. Поэтому одна неверная буква — уже ошибка компиляции:
Console.WriteLine("Start");
Console.Writeline("Finish"); // ✗error CS0117: 'Console' does not contain a definition for 'Writeline'Компилятор сообщает, что у Console нет действия Writeline: есть только WriteLine с большой L. Если написать console вместо Console, ошибка будет другой, CS0103: такого имени компилятор не знает вообще. В обоих случаях программа не запустится, и Start тоже не напечатается.
Ошибки и предупреждения
Кроме ошибок, компилятор C# выдаёт предупреждения. Ошибки и предупреждения различаются тем, что происходит с программой:
- ошибка, строка со словом
error, останавливает компиляцию, и программа не запускается; - предупреждение, строка со словом
warning, программу не останавливает: она компилируется и запускается, но компилятор отметил подозрительное место.
Предупреждение похоже на пометку корректора на полях «проверьте»: рецепт уходит на кухню, но в нём, возможно, ошибка по смыслу. Поэтому предупреждения тоже читают и исправляют, а все примеры курса компилируются без них.
Частая ошибка
Забыли закрывающую кавычку:
Console.WriteLine("Hello); // ✗
Console.WriteLine("Bye");error CS1010: Newline in constant
error CS1003: Syntax error, ',' expected
error CS1026: ) expectedОшибка одна, а сообщений три. Давайте разберём, откуда они взялись:
- Литерал начался с кавычки перед
Helloи не закрылся до конца строки. Об этом первая ошибка: внутри литерала встретился перевод строки. - Скобка, точка с запятой и даже
// ✗оказались внутри литерала, поэтому вызовWriteLineне закрыт. - Компилятор решил, что вызов продолжается на второй строке. Он ждёт запятую перед следующим значением (
CS1003) и закрывающую скобку (CS1026).
Допишите кавычку после Hello, и вместе с первой ошибкой исчезнут две остальные.
Главное
- Ошибка компиляции останавливает программу до запуска: не выполняется ни одна строка, даже верная.
- Сообщение называет файл, строку и символ, код ошибки и что нарушено:
hello.cs(1,27): error CS1002: ; expected. - C# различает большие и маленькие буквы:
WritelineвместоWriteLineиconsoleвместоConsole— ошибки компиляции. - Ошибки исправляют сверху вниз; предупреждение не мешает запуску, но его тоже читают.