Ответ
В 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 для стандартных преобразований между базовыми типами.