Cannot convert, null reference и missing using

Ошибки 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

Как читать ошибку по шагам

Порядок спокойной диагностики:

  1. Прочитайте первую ошибку, а не весь красный список сразу.
  2. Найдите файл и строку.
  3. Посмотрите, что слева от присваивания и что справа.
  4. Проверьте типы.
  5. Проверьте null.
  6. Проверьте using и package reference.
  7. Исправьте одну причину и запустите сборку снова.

Часто одна первая ошибка порождает еще пять следующих. Поэтому не нужно чинить все сообщения одновременно

Частые ошибки новичка

Парсить без проверки. int.Parse упадет на плохом вводе. Для пользовательского ввода лучше TryParse

Ставить ! после nullable без причины. Оператор ! подавляет предупреждение, но не делает значение ненулевым

Добавлять случайные using. Если тип не найден, сначала выясните namespace и пакет, а не добавляйте все подряд

Менять тип переменной ради компиляции. Тип должен соответствовать смыслу данных, а не просто убирать ошибку

Что может быть еще интересно по этой теме

Почему C# не преобразует строку "10" в число сам? Чтобы не было скрытых ошибок. Явное преобразование показывает ваше намерение

NullReferenceException это ошибка компиляции? Нет, это runtime-ошибка. Программа скомпилировалась, но упала при выполнении

Что значит missing using? Обычно файл не видит namespace, где объявлен нужный тип. Иногда еще не подключен NuGet-пакет

Нужно ли читать код ошибки CS0029? Да. Код ошибки помогает быстро найти официальную страницу Microsoft Learn и понять точную причину

Что открыть дальше

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x