Преобразование типов в 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 = 4 (округление)
Bn = 3 (дробная часть отбрасывается)
Cошибка компиляции
Dn = 3.99
2. Чем TryParse отличается от Parse?
ATryParse работает быстрее
BTryParse возвращает bool и не бросает исключение при неверном вводе
CTryParse конвертирует только числа
DНикем не отличается
3. Что означает тип int? (с вопросительным знаком)?
AУсловный int, который может быть любым числом
BNullable int — может хранить int или null
CОшибка синтаксиса
DБеззнаковый int
Поддержать проект