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; // Явное преобразование