back to top

Conversione di tipi di dati in C#

Spesso quando si programma è necessario convertire un tipo di dati in un altro e in C# esistono due tipi di conversione, implicita ed esplicita.

La conversione tra tipi diversi spesso può essere gestita in modo automatico o implicito solo se i valori coinvolti non vengono alterati in alcun modo.

In C# la conversione implicita è supportata nel seguente modo

  • Da sbyte a: short, int, long, float, double, decimal, BigInteger
  • Da byte a: short, ushort, int, uint, long, ulong, float, double, decimal, BigInteger
  • Da short a: int, long, float, double, decimal, BigInteger
  • Da ushort a: int, uint, long, ulong, float, double, decimal, BigInteger
  • Da int a: long, float, double, decimal, BigInteger
  • Da uint a: long, ulong, float, double, decimal, BigInteger
  • Da long, ulong a: float, double, decimal, BigInteger
  • Da float a: double, BigInteger
  • Da char a: ushort, int, uint, long, ulong, float, double, decimal, BigInteger

E ovvio che, ad esempio, è possibile effettuare implicitamente la conversione tra tipi interi solo da un valore più piccolo ad un valore più grande, non il viceversa.

Tuttavia alcune conversioni non possono essere effettuate implicitamente per la possibile perdita di dati. Queste sono:

  • Da int a short
  • Da int a uint
  • Da uint a int
  • Da float a int
  • Da qualsiasi tipo numeric a char
  • Da decimal a qualsiasi tipo numeric
  • Da int? a int

In questi casi è possibile forzare la conversione tramite il cosiddetto cast. Quando si effettua un cast da un tipo ad un altro si forza il compilatore ad effettuare la conversione.

long valore = 30000;
int i = (int)val;

Nel caso precedente la conversione va a buon fine perchè 30000 è un valore che rientra nei limiti del tipo int… ma se il valore fosse stato di 3000000000? non avremmo avuto un errore ma non avremmo avuto nemmeno il valore che ci saremmo aspettati in quanto il valore risultante sarebbe -1294967296.

Boxing e Unboxing

In C# sono poi molto importanti i concetti di boxing e unboxing che consentono di convertire tipi valore in tipi referenza e viceversa. Il boxing è la conversione da un tipo valore ad un tipo riferimento come nel caso seguente

int mioNumero = 20; // Tipo valore
object mioOggetto = mioNumero; // Tipo riferimento

Unboxing è il processo inverso

int mioNumero = 20; // Tipo valore
object mioOggetto = mioNumero; // Tipo riferimento
int altroNumero = (int) mioNumero; // Tipo valore

Una variabile riferimento può essere convertita ad un tipo valore solo se essa proviene da un tipo valore tramite boxing.

Pubblicitร