Sobes.tech
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; // Експлицитни прелаз