Sobes.tech
Junior

Ce tipuri de conversie de tipuri există în C#?

sobes.tech AI

Răspuns de la AI

În C# există două tipuri principale de conversie a tipurilor: explicită și implicită.

Conversie implicită (Implicit)

Are loc automat atunci când compilatorul este sigur că conversia este sigură și nu va duce la pierderea datelor. De exemplu, de la un tip cu un interval mai mic la unul cu un interval mai mare.

// Conversie implicită de la int la long
int i = 100;
long l = i;

Conversie explicită

Necesită indicarea în cod a operatorului de conversie ((tip)) și se folosește atunci când conversia poate duce la pierderea datelor sau poate arunca o excepție. Este necesară la conversia de la un tip cu un interval mai mare la unul cu un interval mai mic sau între tipuri nelegate.

// Conversie explicită de la double la int
double d = 123.45;
int i = (int)d; // Partea zecimală este ignorată

// Conversie explicită de la object la string
object obj = "Hello";
string s = (string)obj;

// Utilizarea operatorilor as și is
object objAs = "World";
string sAs = objAs as string; // Returnează null dacă conversia nu este posibilă
if (objAs is string) // Verifică dacă obiectul este de tip string
{
    string sIs = (string)objAs;
}

Compararea conversiei explicite, as și is

Operație Descriere Eroare în caz de eșec
(Tip) expresie Conversie explicită. Necesită potrivirea exactă a tipului. InvalidCastException
expresie as Tip Încearcă să convertească tipul. Funcționează doar pentru tipuri referențiale și tipuri care permit null. Returnează null
expresie is Tip Verifică dacă expresia poate fi convertită la tipul specificat. Valoare booleană (true/false)

Conversii personalizate

Dezvoltatorul poate defini propriile operatori de conversie explicită și implicită pentru tipuri personalizate, folosind cuvintele cheie implicit și explicit.

// Exemplu de conversie implicită personalizată
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; }
}

// Utilizare
Inches inches = new Inches { Value = 10 };
Millimeters mm = inches; // Conversie implicită
// Exemplu de conversie explicită personalizată
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) };
    }
}

// Utilizare
Pounds pounds = new Pounds { Value = 100 };
Kilograms kg = (Kilograms)pounds; // Conversie explicită