Sobes.tech
Junior
126
questionbank

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

Answer from AI

sobes.tech AI

В C# существует два основных вида приведения типов: явное и неявное.

Неявное (Implicit) приведение типов

Происходит автоматически, когда компилятор уверен, что преобразование безопасно и не приведет к потере данных. Например, из типа с меньшим диапазоном значений в тип с большим.

// Неявное приведение int к long
int i = 100;
long l = i;

Явное (Explicit) приведение типов

Требует указания в коде оператора приведения ((тип)) и используется, когда преобразование может привести к потере данных или вызывать исключение. Оно необходимо при преобразовании из типа с большим диапазоном значений в тип с меньшим или между несвязанными типами.

// Явное приведение double к int
double d = 123.45;
int i = (int)d; // Дробная часть отбрасывается

// Явное приведение object к string
object obj = "Hello";
string s = (string)obj;

// Приведение с использованием операторов as и is
object objAs = "World";
string sAs = objAs as string; // Возвращает null, если преобразование невозможно
if (objAs is string) // Проверяет, является ли объект типом string
{
    string sIs = (string)objAs;
}

Сравнение явного приведения, as и is

Операция Описание Ошибка при неудаче
(Тип) выражение Явное приведение. Требует точного соответствия типа. InvalidCastException
выражение as Тип Пробует привести тип. Работает только для ссылочных типов и типов, допускающих null. Возвращает null
выражение is Тип Проверяет, можно ли привести выражение к указанному типу. Булево значение (true/false)

Пользовательские преобразования

Разработчик может определить свои собственные явные и неявные операторы преобразования для пользовательских типов, используя ключевые слова implicit и explicit.

// Пример пользовательского неявного преобразования
public class Inches
{
    public int Value { get; set; }
    public static implicit operator Millimeters(Inches i)
    {
        return new Millimeters { Value = i.Value * 25 };
    }
}

public class Millimeters
{
    public int Value { get; set; }
}

// Использование
Inches inches = new Inches { Value = 10 };
Millimeters mm = inches; // Неявное преобразование
// Пример пользовательского явного преобразования
public class Kilograms
{
    public int Value { get; set; }
}

public class Pounds
{
    public int Value { get; set; }
    public static explicit operator Kilograms(Pounds p)
    {
        return new Kilograms { Value = (int)(p.Value / 2.20462) };
    }
}

// Использование
Pounds pounds = new Pounds { Value = 100 };
Kilograms kg = (Kilograms)pounds; // Явное преобразование