Чести грешки

Срещнал си грешка? Намери я тук (или през търсенето — Ctrl K) и виж какво означава, защо се случва и как се оправя. Съобщението за грешка не е наказание — то е упътване.

Компилационни грешки

Кодът отказва да се компилира — Visual Studio ги подчертава в червено още докато пишете.

CS1002

Липсваща точка и запетая

; expected

Защо се случва: Команда не завършва с ;. Компилаторът често посочва следващия ред, не виновния — гледайте и реда над посочения.

Как се оправя: Добавете ; в края на командата. Помнете: след if (...), for (...) и дефиниция на метод НЕ се пише ;.

CS0103

Непознато име

The name 'myVariable' does not exist in the current context

Защо се случва: Използвате име, което не съществува: правописна грешка, разлика в главни/малки букви (myVariableMyVariable), или променливата е декларирана в друг блок (вътре в if/цикъл) и тук не се вижда.

Как се оправя: Проверете изписването буква по буква. Ако променливата трябва да се ползва и след блока — декларирайте я преди него.

CS0029

Несъвместими типове

Cannot implicitly convert type 'string' to 'int'

Защо се случва: Опит да се присвои стойност от един тип на променлива от друг — най-често резултатът от Console.ReadLine() (винаги string) директно в число.

Как се оправя: Преобразувайте изрично: int n = int.Parse(Console.ReadLine()); или ползвайте int.TryParse. Обратно (число → текст): n.ToString().

CS0161

Не всички пътища връщат стойност

not all code paths return a value

Защо се случва: Метод с връщан тип (напр. int) има път на изпълнение, който не стига до return — типично: return само вътре в if, без else.

Как се оправя: Гарантирайте return по всеки път: добавете return след if-а или в else. Компилаторът трябва да е сигурен, че методът винаги връща нещо.

CS1513

Липсваща затваряща скоба

} expected

Защо се случва: Незатворена къдрава скоба — някой блок (if, цикъл, метод, клас) е отворен с {, но не е затворен. Грешката често сочи края на файла.

Как се оправя: Подравнете кода (във Visual Studio: Ctrl+K, Ctrl+D) — разместеното подравняване издава мястото. Пишете { и } едновременно и после пълнете блока.

Грешки по време на изпълнение (изключения)

Програмата се компилира, но "гърми" при изпълнение. Как се обработват — вижте модула за изключения.

FormatException

Невалиден формат при парсване

Input string was not in a correct format.

Защо се случва: int.Parse / double.Parse получава текст, който не е число: букви, празен низ (само Enter), или дробно число с грешен десетичен знак.

Как се оправя: Използвайте int.TryParse(input, out int n) — връща false вместо да гърми, и питайте отново. Алтернатива: try-catch около парсването.

NullReferenceException

Обектът е null

Object reference not set to an instance of an object.

Защо се случва: Извикване на метод/свойство върху променлива, която е null — обектът никога не е създаден с new, или метод е върнал null (напр. FirstOrDefault без съвпадение).

Как се оправя: Проверете с if (obj != null) преди употреба. Намерете КЪДЕ е трябвало обектът да се създаде — обикновено липсва new или резултат не е проверен.

IndexOutOfRangeException

Индекс извън масива

Index was outside the bounds of the array.

Защо се случва: Достъп до елемент на невалиден индекс. Класиката: arr[arr.Length] — последният валиден индекс е Length - 1, защото броенето тръгва от 0. Чест виновник е и i <= arr.Length в цикъл.

Как се оправя: Циклите винаги с i < arr.Length (не <=). Преди ръчен достъп: if (i >= 0 && i < arr.Length).

DivideByZeroException

Делене на нула

Attempted to divide by zero.

Защо се случва: Целочислено делене (int / int) с делител 0 — често когато делителят идва от потребителя или от пресмятане. (Любопитно: при double няма грешка — резултатът е Infinity!)

Как се оправя: Проверете делителя преди операцията: if (b == 0) { Console.WriteLine("Не може да се дели на нула!"); }.

KeyNotFoundException

Липсващ ключ в речник

The given key was not present in the dictionary.

Защо се случва: Четене от Dictionary по ключ, който не съществува: prices["липсващ"].

Как се оправя: Преди четене: if (dict.ContainsKey(key)), или още по-добре — dict.TryGetValue(key, out var value). Записването по нов ключ е винаги безопасно.

FileNotFoundException

Файлът не е намерен

Could not find file 'C:\...\data.txt'.

Защо се случва: Четене на файл, който не съществува на посочения път. При относителен път ("data.txt") програмата търси в папката, от която се изпълнява (bin/Debug) — не в папката на проекта!

Как се оправя: Проверявайте с File.Exists(path) преди четене. Погледнете в съобщението КЪДЕ точно е търсен файлът — пътят в грешката казва всичко.

InvalidOperationException

Промяна на колекция по време на foreach

Collection was modified; enumeration operation may not execute.

Защо се случва: Добавяне или премахване на елементи от списък, докато той се обхожда с foreach — колекцията не може да се променя по време на обхождането.

Как се оправя: Обхождайте копие: foreach (var x in list.ToList()), съберете промените в отделен списък и ги приложете след цикъла, или ползвайте for цикъл отзад напред.

Как се чете съобщение за грешка

  1. Типът (напр. FormatException) казва какво се е объркало.
  2. Съобщението уточнява детайла (кой файл, кой ключ, какъв формат).
  3. Редът (line 14) или stack trace-ът казва къде — започнете оттам.
  4. Ако не помогне — потърсете типа на грешката тук в наръчника или в търсачка.

Начален курс по C# — учебен наръчник и бърз справочник за студенти.

Натисни Ctrl K или / отвсякъде, за да търсиш.