Sobes.tech
Junior

Quali sono i tipi di conversione di tipo in C#?

sobes.tech AI

Risposta dell'AI

In C# ci sono due principali tipi di conversione di tipo: implicita ed esplicita.

Conversione implicita

Avviene automaticamente quando il compilatore è sicuro che la conversione sia sicura e non causi perdita di dati. Ad esempio, da un tipo con un intervallo più piccolo a uno con un intervallo più grande.

// Conversione implicita da int a long
int i = 100;
long l = i;

Conversione esplicita

Richiede di indicare nel codice l'operatore di conversione ((tipo)) ed è usata quando la conversione può portare a perdita di dati o generare un'eccezione. È necessaria quando si converte da un tipo con un intervallo più grande a uno con un intervallo più piccolo o tra tipi non correlati.

// Conversione esplicita da double a int
double d = 123.45;
int i = (int)d; // La parte decimale viene scartata

// Conversione esplicita da object a string
object obj = "Hello";
string s = (string)obj;

// Uso degli operatori as e is
object objAs = "World";
string sAs = objAs as string; // Ritorna null se la conversione non è possibile
if (objAs is string) // Verifica se l'oggetto è di tipo string
{
    string sIs = (string)objAs;
}

Confronto tra conversione esplicita, as e is

Operazione Descrizione Errore in caso di fallimento
(Tipo) espressione Conversione esplicita. Richiede corrispondenza esatta del tipo. InvalidCastException
espressione as Tipo Tenta di convertire il tipo. Funziona solo per tipi di riferimento e tipi che consentono null. Ritorna null
espressione is Tipo Verifica se l'espressione può essere convertita al tipo specificato. Valore booleano (true/false)

Conversioni personalizzate

Lo sviluppatore può definire i propri operatori di conversione esplicita e implicita per tipi personalizzati, usando le parole chiave implicit e explicit.

// Esempio di conversione implicita personalizzata
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; }
}

// Uso
Inches inches = new Inches { Value = 10 };
Millimeters mm = inches; // Conversione implicita
// Esempio di conversione esplicita personalizzata
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) };
    }
}

// Uso
Pounds pounds = new Pounds { Value = 100 };
Kilograms kg = (Kilograms)pounds; // Conversione esplicita