Junior
Koje vrste konverzije tipova postoje u C#?
sobes.tech АИ
Одговор од АИ
У језику 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; // Експлицитни прелаз