Ответ
В C# преобразование типов делится на несколько категорий в зависимости от безопасности и механизма.
1. Неявное преобразование (Implicit Conversion)
Выполняется компилятором автоматически, когда преобразование безопасно и не ведет к потере данных.
int intValue = 100;
long longValue = intValue; // Неявное: int -> long
double doubleValue = longValue; // Неявное: long -> double
2. Явное преобразование (Приведение, Explicit Cast)
Требует указания целевого типа в скобках. Используется, когда преобразование может привести к потере данных или исключению.
double pi = 3.14159;
int intPi = (int)pi; // Явное приведение. Результат: 3 (дробная часть отбрасывается)
object obj = "Hello";
string str = (string)obj; // Приведение типа объекта. Выбросит InvalidCastException, если obj не string.
3. Преобразование с помощью методов класса Convert
Универсальные методы для преобразования между базовыми типами, которые обрабатывают null и вызовут InvalidCastException или FormatException при неудаче.
string numberStr = "123";
int result = Convert.ToInt32(numberStr);
// Convert также обрабатывает округление: Convert.ToInt32(4.7) вернет 5.
4. Парсинг строк
Самый распространенный способ получить значение из строки.
// Может выбросить FormatException, если строка имеет неверный формат.
int parsed = int.Parse("456");
// Безопасная альтернатива. Возвращает bool и результат в out-параметр.
bool success = int.TryParse("456abc", out int tryParsedResult); // success = false, tryParsedResult = 0
5. Пользовательские преобразования
Можно определить для своих типов с помощью ключевых слов implicit (для неявных) и explicit (для явных).
public class Meter
{
public double Value { get; set; }
// Неявное преобразование из double в Meter
public static implicit operator Meter(double d) => new Meter { Value = d };
// Явное преобразование из Meter в int
public static explicit operator int(Meter m) => (int)m.Value;
}
Meter distance = 10.5; // Неявный вызов: double -> Meter
int approxDistance = (int)distance; // Явный вызов: Meter -> int
Выбор способа: Используйте TryParse для ввода пользователя, явное приведение когда уверены в типе, а Convert для стандартных преобразований между базовыми типами.
Ответ 18+ 🔞
А, ну это же классика, про которую каждый второй джуниор ломает зубы! Смотри, тут всё просто, как три копейки, но если не понимать разницу — можно так накосячить, что мало не покажется.
Вот смотри, представь, что типы — это как разные стаканы. Есть стакан-рюмка (это int), а есть стакан-литровая банка (это long). Преобразования — это просто переливание из одного стакана в другой.
1. Неявное преобразование — когда всё само и безопасно
Это когда ты из рюмки переливаешь в банку. В банку всё влезет, нихуя не прольётся, компилятор сам всё сделает, даже не спросит. Умный же.
int рюмка = 100; // Маленький стакан
long банка = рюмка; // Автоматом перелил в большой. Всё ок.
Типа int в long, float в double. Главное, чтобы места в целевом типе было за глаза.
2. Явное приведение (каст) — когда надо принудительно и есть риск
А вот это уже интереснее. Это когда ты пытаешься литр воды из банки влить обратно в рюмку. Блядь, так не бывает, всё же выльется! Но ты говоришь компилятору: «Да похуй, я знаю, что делаю, вот тебе скобочки, делай!». А он такой: «Ну, раз настаиваешь... но сам потом не плачь».
double банкаСВодой = 3.14159;
int рюмка = (int)банкаСВодой; // Явно кастуем. Результат? 3. Всё, что после точки, нахуй сброшено. Потеря данных? Естественно!
Или ещё веселее с объектами:
object какойтоХуйня = "Привет";
string строка = (string)какойтоХуйня; // Ок, он и правда строка.
// А если там не строка? Правильно, получишь InvalidCastException прямо в ебало. Красота!
3. Класс Convert — универсальный солдат
Это как твой знакомый алкаш, который из чего угодно может сделать бухло. Ну, типа, пытается. Методы ToInt32, ToDouble и прочие. Умеет округлять (не как каст, который просто отрезает), обрабатывает null (для null в ссылочных типах вернёт ноль для чисел, например), но тоже может выдать сюрприз.
string строкаСЦифрой = "123";
int число = Convert.ToInt32(строкаСЦифрой); // Ок.
// А вот это уже интересно:
int округлённое = Convert.ToInt32(4.7); // Вернёт 5, блядь! Потому что банковское округление.
// А если передать "abc"? FormatException, дружок, получи и распишись.
4. Парсинг строк — классика для работы с пользовательским вводом
Тут два пути: геройский и трусливый.
Геройский (Parse): «Да я уверен, что в строке число!»
int число = int.Parse("456"); // Если там число — красава. Если "456abc" — получи FormatException в лучших традициях.
Трусливый, но умный (TryParse): «А давай проверим, прежде чем делать?»
bool получилось = int.TryParse("456abc", out int результат);
// получилось = false, результат = 0
// Никаких исключений, тихо и мирно. Идеально для ввода от пользователя, который может написать что угодно.
5. Пользовательские преобразования — когда ты сам себе хозяин
Вот это уже высший пилотаж. Можешь для своих классов или структур определить, как они превращаются друг в друга. Есть implicit (неявное, безопасное) и explicit (явное, с потерей данных).
public class Метр
{
public double Значение { get; set; }
// Неявное: double -> Метр. Компилятор сам сделает.
public static implicit operator Метр(double d) => new Метр { Значение = d };
// Явное: Метр -> int. Требует прямого указания.
public static explicit operator int(Метр m) => (int)m.Значение;
}
Метр расстояние = 10.5; // Неявно сработало! double сам стал Метром.
int примерноРасстояние = (int)расстояние; // Явно кастуем. Будет 10.
Итог, чувак:
- Неявное — когда на 100% безопасно. Компилятор за тебя.
- Явный каст — когда сам всё контролируешь и готов к последствиям (потеря данных, исключение).
Convert— для стандартных преобразований между базовыми типами с округлением и обработкойnull.TryParse— святое дело для чтения пользовательского ввода.Parseтолько если данные из надёжного источника.- Пользовательские операторы — когда хочешь, чтобы твои типы красиво дружили.
Запомни это, а то будешь потом ловить исключения на ровном месте, как лох.