Преобразование типов в C#

Преобразование типов в C#: неявное и явное приведение, Convert, Parse, TryParse — как переводить данные из одного типа в другой.

Преобразование типов — превращение значения одного типа данных в другой. C# строго типизирован, поэтому смешивать несовместимые типы напрямую нельзя — нужно явно указать, как конвертировать.

Неявное преобразование

Когда новый тип «шире» исходного, C# конвертирует автоматически — без потери данных:

int a = 42;
long b = a;       // int → long: автоматически
double c = a;     // int → double: автоматически

Console.WriteLine(b);
Console.WriteLine(c);

Вывод:

42
42

Из

Автоматически в

int

long, float, double, decimal

float

double

char

int, long

Явное приведение (casting)

Когда данные могут потеряться (широкий тип → узкий), нужно явно указать тип в скобках:

double pi = 3.14159;
int n = (int)pi;    // дробная часть отбрасывается!
Console.WriteLine(n);  // 3

long bigNum = 300;
byte small = (byte)bigNum;  // 300 не влезает в byte (0..255) — данные портятся!
Console.WriteLine(small);  // 44 (300 % 256)

Вывод:

3
44

Явное приведение не проверяет переполнение — данные могут молча исказиться. Убедитесь, что значение умещается в целевой тип.

Класс Convert

Convert удобен для преобразований «через» тип, особенно из строки:

string s = "123";
int n = Convert.ToInt32(s);
double d = Convert.ToDouble("3.14");
bool flag = Convert.ToBoolean(1);   // true

Console.WriteLine(n + 1);     // 124
Console.WriteLine(d * 2);     // 6.28
Console.WriteLine(flag);      // True

Вывод:

124
6.28
True

Parse и TryParse

Parse преобразует строку в число, но бросает исключение, если строка не является числом. TryParse безопаснее — возвращает false вместо исключения:

// Parse — может выбросить FormatException
int x = int.Parse("42");
Console.WriteLine(x);  // 42

// TryParse — безопасная версия
string input = "abc";
bool ok = int.TryParse(input, out int result);
Console.WriteLine(ok);      // False
Console.WriteLine(result);  // 0 (значение по умолчанию)

Вывод:

42
False
0

Правило: используйте TryParse, когда строка приходит от пользователя или из файла — она может быть некорректной.

Nullable-типы

Обычный int не может хранить «ничего». Nullable-тип int? может принять null — это удобно для данных из базы или ввода пользователя:

int? age = null;  // ещё не введено
Console.WriteLine(age.HasValue);  // False

age = 25;
Console.WriteLine(age.HasValue);  // True
Console.WriteLine(age.Value);     // 25

// Оператор ?? — «взять значение или запасное»
int realAge = age ?? 0;
Console.WriteLine(realAge);  // 25

Вывод:

False
True
25
25

Коротко

  • Неявное преобразование — автоматически, когда новый тип «шире» (нет потери данных).
  • Явное приведение (тип)значение — когда данные могут потеряться; ответственность на программисте.
  • Convert.ToXxx — универсальный конвертер, в том числе из строки.
  • Parse — строку в число; бросает исключение при ошибке. TryParse — безопасная версия, возвращает bool.
  • int? — nullable-тип; хранит значение или null; оператор ?? задаёт значение по умолчанию.
Проверьте себя
1. Что произойдёт при коде: int n = (int)3.99;
An = 3 (дробная часть отбрасывается)
Bn = 4 (округление)
Cошибка компиляции
Dn = 3.99
2. Чем TryParse отличается от Parse?
ATryParse возвращает bool и не бросает исключение при неверном вводе
BTryParse работает быстрее
CTryParse конвертирует только числа
DНикем не отличается
3. Что означает тип int? (с вопросительным знаком)?
AУсловный int, который может быть любым числом
BОшибка синтаксиса
CNullable int — может хранить int или null
DБеззнаковый int