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