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