Sobes.tech
Junior

Jakie rodzaje konwersji typów istnieją w C#?

sobes.tech AI

Odpowiedź od AI

W C# istnieją dwa główne rodzaje rzutowania typów: jawne i niejawne.

Rzutowanie niejawne (Implicit)

Występuje automatycznie, gdy kompilator jest pewien, że konwersja jest bezpieczna i nie spowoduje utraty danych. Na przykład z typu o mniejszym zakresie do typu o większym zakresie.

// Niejawne rzutowanie int na long
int i = 100;
long l = i;

Rzutowanie jawne (Explicit)

Wymaga wskazania w kodzie operatora rzutowania ((typ)) i jest używane, gdy konwersja może prowadzić do utraty danych lub wywołać wyjątek. Jest konieczne przy konwersji z typu o większym zakresie na typ o mniejszym lub między niepowiązanymi typami.

// Jawne rzutowanie double na int
double d = 123.45;
int i = (int)d; // Ułamek jest odrzucany

// Jawne rzutowanie obiektu na string
object obj = "Hello";
string s = (string)obj;

// Użycie operatorów as i is
object objAs = "World";
string sAs = objAs as string; // Zwraca null, jeśli konwersja jest niemożliwa
if (objAs is string) // Sprawdza, czy obiekt jest typu string
{
    string sIs = (string)objAs;
}

Porównanie rzutowania jawnego, as i is

Operacja Opis Błąd w przypadku niepowodzenia
(Typ) wyrażenie Rzutowanie jawne. Wymaga dokładnego dopasowania typu. InvalidCastException
wyrażenie as Typ Próba konwersji typu. Działa tylko dla typów referencyjnych i typów, które pozwalają null. Zwraca null
wyrażenie is Typ Sprawdza, czy wyrażenie można przekonwertować na podany typ. Wartość boolowska (true/false)

Niestandardowe konwersje

Programista może zdefiniować własne operatory konwersji jawnej i niejawnej dla własnych typów, używając słów kluczowych implicit i explicit.

// Przykład niestandardowej konwersji niejawnej
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; }
}

// Użycie
Inches inches = new Inches { Value = 10 };
Millimeters mm = inches; // Konwersja niejawna
// Przykład niestandardowej konwersji jawnej
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) };
    }
}

// Użycie
Pounds pounds = new Pounds { Value = 100 };
Kilograms kg = (Kilograms)pounds; // Konwersja jawna