Ошибки C# не нужно чинить хаотичным копированием кода из поиска. У компилятора и runtime почти всегда есть подсказка: тип не совпал, значение оказалось null, namespace не подключен, пакет не добавлен. В этом уроке разберем три частых ситуации: Cannot implicitly convert type, NullReferenceException и missing using
Цель — научиться читать ошибку и идти по проверкам, а не угадывать
Что получится в конце
Вы будете понимать, почему такой код не собирается:
int count = "10";
почему такой код падает во время выполнения:
string? name = null;
Console.WriteLine(name.Length);
и почему иногда достаточно добавить:
using System.Text.Json;
Ошибка cannot implicitly convert
Пример:
int count = "10";
Компилятор не может положить строку в переменную типа int. Ошибка часто выглядит как CS0029:
Cannot implicitly convert type 'string' to 'int'
Исправление зависит от смысла
Если значение должно быть числом:
int count = int.Parse("10");
Если строка пришла от пользователя, безопаснее:
var input = "10";
if (int.TryParse(input, out var count))
{
Console.WriteLine($"Количество: {count}");
}
else
{
Console.WriteLine("Введите число");
}
Если значение на самом деле текст, меняйте тип переменной:
string count = "10";
Не лечите такую ошибку случайным приведением типа. Сначала ответьте: какие данные я хочу хранить?
int, double, decimal и bool
Та же логика встречается с числами:
decimal price = 1200.5;
Здесь 1200.5 по умолчанию воспринимается как double. Для decimal нужен суффикс:
decimal price = 1200.5m;
Еще один частый перенос привычки из JavaScript:
int count = 1;
if (count)
{
Console.WriteLine("Есть товары");
}
В C# условие должно быть bool, поэтому нужно явно сравнить:
if (count > 0)
{
Console.WriteLine("Есть товары");
}
NullReferenceException
NullReferenceException возникает, когда вы обращаетесь к объекту, которого нет
string? name = null;
Console.WriteLine(name.Length);
name равен null, значит у него нельзя прочитать Length
Исправление:
if (name is not null)
{
Console.WriteLine(name.Length);
}
else
{
Console.WriteLine("Имя не задано");
}
Или для строки:
if (!string.IsNullOrWhiteSpace(name))
{
Console.WriteLine(name.Length);
}
Современный C# с nullable reference types помогает замечать такие места заранее. Не выключайте предупреждения просто потому, что они мешают. Они часто показывают реальную будущую ошибку
Null после Console.ReadLine
Типичный пример из консольного урока:
string? input = Console.ReadLine();
Console.WriteLine(input.Length);
Правильно:
string? input = Console.ReadLine();
if (string.IsNullOrWhiteSpace(input))
{
Console.WriteLine("Пустой ввод");
return;
}
Console.WriteLine(input.Length);
После проверки компилятору и человеку понятнее: дальше input можно использовать как непустую строку
Missing using и namespace
Иногда тип существует, но компилятор его не видит:
var json = JsonSerializer.Serialize(new { Name = "Алия" });
Ошибка может говорить, что JsonSerializer не найден. Нужно подключить namespace:
using System.Text.Json;
Другой пример:
var orders = new List<string>();
Если implicit usings отключены, может понадобиться:
using System.Collections.Generic;
using не скачивает пакет. Он только делает namespace доступным в файле. Если нужной библиотеки нет в проекте, придется добавить package через dotnet add package
Как читать ошибку по шагам
Порядок спокойной диагностики:
- Прочитайте первую ошибку, а не весь красный список сразу.
- Найдите файл и строку.
- Посмотрите, что слева от присваивания и что справа.
- Проверьте типы.
- Проверьте
null. - Проверьте
usingи package reference. - Исправьте одну причину и запустите сборку снова.
Часто одна первая ошибка порождает еще пять следующих. Поэтому не нужно чинить все сообщения одновременно
Частые ошибки новичка
Парсить без проверки. int.Parse упадет на плохом вводе. Для пользовательского ввода лучше TryParse
Ставить ! после nullable без причины. Оператор ! подавляет предупреждение, но не делает значение ненулевым
Добавлять случайные using. Если тип не найден, сначала выясните namespace и пакет, а не добавляйте все подряд
Менять тип переменной ради компиляции. Тип должен соответствовать смыслу данных, а не просто убирать ошибку
Что может быть еще интересно по этой теме
Почему C# не преобразует строку "10" в число сам? Чтобы не было скрытых ошибок. Явное преобразование показывает ваше намерение
NullReferenceException это ошибка компиляции? Нет, это runtime-ошибка. Программа скомпилировалась, но упала при выполнении
Что значит missing using? Обычно файл не видит namespace, где объявлен нужный тип. Иногда еще не подключен NuGet-пакет
Нужно ли читать код ошибки CS0029? Да. Код ошибки помогает быстро найти официальную страницу Microsoft Learn и понять точную причину
Что открыть дальше
- Типы, переменные и строки в C# — чтобы закрепить типы и
var. - JSON и файлы в C#: читаем настройки проекта — там часто встречаются missing using и nullable.
- ASP.NET Core Minimal API: первый endpoint — ошибки превращаются в HTTP-ответы.
- C# и .NET Framework: что выбрать новичку — чтобы не искать решение в старом стеке без причины.



