Junior
Какви видове преобразувания на типове съществуват в C#?
sobes.tech AI
Отговор от AI
В C# има два основни вида преобразуване на типове: явен и неявен.
Неявно преобразуване
Произвежда се автоматично, когато компилаторът е сигурен, че преобразуването е безопасно и няма да доведе до загуба на данни. Например, от тип с по-малък диапазон към тип с по-голям.
// Неявно преобразуване от int към long
int i = 100;
long l = i;
Явно преобразуване
Изисква указване на оператор за преобразуване ((тип)) в кода и се използва, когато преобразуването може да доведе до загуба на данни или да предизвика изключение. Необходимо е при преобразуване от тип с по-голям диапазон към тип с по-малък или между несвързани типове.
// Явно преобразуване от 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; // Явно преобразуване