Какие существуют способы преобразования типов данных в C#?

«Какие существуют способы преобразования типов данных в C#?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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