Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Poiché C# viene tipizzato in modo statico in fase di compilazione, dopo la dichiarazione di una variabile, non può essere dichiarato nuovamente o assegnato un valore di un altro tipo a meno che tale tipo non sia implicitamente convertibile nel tipo della variabile. Ad esempio, string
non può essere convertito in modo implicito in int
. Pertanto, dopo aver dichiarato i
come int
, non è possibile assegnarvi la stringa "Hello", come illustrato nel codice seguente:
int i;
// error CS0029: can't implicitly convert type 'string' to 'int'
i = "Hello";
Tuttavia, a volte potrebbe essere necessario copiare un valore in una variabile o in un parametro del metodo di un altro tipo. Ad esempio, potrebbe essere disponibile una variabile integer che è necessario passare a un metodo il cui parametro è tipizzato come double
. In alternativa, potrebbe essere necessario assegnare una variabile di classe a una variabile di un tipo di interfaccia. Questi tipi di operazioni sono denominate conversioni di tipi. In C# è possibile eseguire i tipi di conversioni seguenti:
Conversioni implicite: non è necessaria alcuna sintassi speciale perché la conversione ha sempre esito positivo e non viene perso alcun dato. Ad esempio, le conversioni da tipi integrali più piccoli a più grandi, conversioni da classi derivate a classi di base e conversioni di intervalli.
Conversioni esplicite (cast): Le conversioni esplicite richiedono un'espressione di cast. Il cast è necessario quando le informazioni potrebbero essere perse nella conversione o quando la conversione potrebbe non riuscire per altri motivi. Gli esempi tipici includono la conversione numerica in un tipo con una precisione minore o un intervallo più piccolo e la conversione di un'istanza della classe base in una classe derivata.
Conversioni definite dall'utente: le conversioni definite dall'utente usano metodi speciali che è possibile definire per abilitare conversioni esplicite e implicite tra tipi personalizzati che non hanno una relazione di classe derivata dalla classe base. Per altre informazioni, vedere Operatori di conversione definiti dall'utente.
Conversioni con classi helper: per eseguire la conversione tra tipi non conformi, ad esempio numeri interi e System.DateTime oggetti, o stringhe esadecimali e matrici di byte, è possibile usare la System.BitConverter classe, la System.Convert classe e i
Parse
metodi dei tipi numerici predefiniti, ad esempio Int32.Parse. Per altre informazioni, vedere gli articoli seguenti:Come eseguire la conversione tra stringhe esadecimali e tipi numerici
Conversioni implicite
Per i tipi numerici predefiniti, è possibile eseguire una conversione implicita quando il valore da archiviare può rientrare nella variabile senza essere troncato o arrotondato. Per i tipi integrali, questa restrizione indica che l'intervallo del tipo di origine è un subset appropriato dell'intervallo per il tipo di destinazione. Ad esempio, una variabile di tipo long (integer a 64 bit) può archiviare qualsiasi valore che un valore int (intero a 32 bit) possa archiviare. Nell'esempio seguente il compilatore converte in modo implicito il valore di num
a destra in un tipo long
prima di assegnarlo a bigNum
.
// Implicit conversion. A long can
// hold any value an int can hold, and more!
int num = 2147483647;
long bigNum = num;
Per un elenco completo di tutte le conversioni numeriche implicite, vedere la sezione Conversioni numeriche implicite dell'articolo Conversioni numeriche predefinite .
Per i tipi di riferimento, una conversione implicita esiste sempre da una classe a una delle relative classi o interfacce di base dirette o indirette. Non è necessaria alcuna sintassi speciale perché una classe derivata contiene sempre tutti i membri di una classe di base.
Derived d = new Derived();
// Always OK.
Base b = d;
Conversioni esplicite
Tuttavia, se non è possibile eseguire una conversione senza rischiare di perdere informazioni, il compilatore richiede l'esecuzione di una conversione esplicita, denominata cast. Un cast è un modo per eseguire in modo esplicito la conversione. Indica che sei consapevole che potrebbe verificarsi una perdita di dati o che il cast potrebbe fallire durante l'esecuzione. Per effettuare un cast, si deve specificare il tipo di destinazione tra parentesi prima dell'espressione da convertire. Il programma seguente converte un double in un int. Il programma non viene compilato senza la conversione.
double x = 1234.7;
int a;
// Cast double to int.
a = (int)x;
Console.WriteLine(a);
// Output: 1234
Per un elenco completo delle conversioni numeriche esplicite supportate, vedere la sezione Conversioni numeriche esplicite dell'articolo Conversioni numeriche predefinite .
Per i tipi di riferimento, è necessario un cast esplicito se è necessario eseguire la conversione da un tipo di base a un tipo derivato:
Un'operazione di cast tra tipi di riferimento non modifica il tipo di runtime dell'oggetto sottostante; modifica solo il tipo del valore utilizzato come riferimento a tale oggetto. Per altre informazioni, vedere Polimorfismo.
Eccezioni di conversione dei tipi in fase di esecuzione
In alcune conversioni di tipi di riferimento, il compilatore non è in grado di determinare se un cast è valido. È possibile che un'operazione di cast, correttamente compilata, possa non riuscire durante l'esecuzione. Come illustrato nell'esempio seguente, un cast di tipo che ha esito negativo in fase di esecuzione fa sì che venga generata un'eccezione InvalidCastException .
Animal a = new Mammal();
Reptile r = (Reptile)a; // InvalidCastException at run time
Effettuare il cast esplicito dell'argomento a
in un Reptile
implica un'assunzione rischiosa. È più sicuro non fare ipotesi, ma controllare il tipo. C# fornisce l'operatore is
per consentire di testare la compatibilità prima di eseguire effettivamente un cast. Per ulteriori informazioni, vedere Come eseguire il cast in modo sicuro usando il pattern matching e gli operatori as e is.
Specificazione del linguaggio C#
Per altre informazioni, vedere la sezione Conversioni della specifica del linguaggio C#.