Condividi tramite


Conversioni numeriche predefinite (riferimenti per C#)

C# fornisce un set di tipi numerici integrali e a virgola mobile . Esiste una conversione implicita o esplicita tra due tipi numerici. Usare un'espressione cast per eseguire una conversione esplicita.

Il riferimento al linguaggio C# documenta la versione rilasciata più di recente del linguaggio C#. Contiene anche la documentazione iniziale per le funzionalità nelle anteprime pubbliche per la versione futura del linguaggio.

La documentazione identifica tutte le funzionalità introdotte nelle ultime tre versioni della lingua o nelle anteprime pubbliche correnti.

Suggerimento

Per trovare quando una funzionalità è stata introdotta per la prima volta in C#, vedere l'articolo sulla cronologia delle versioni del linguaggio C#.

Conversioni numeriche implicite

La tabella seguente illustra le conversioni implicite predefinite tra i tipi numerici predefiniti:

Da Per
sbyte short, int, long, floatdouble, , decimal, onint
byte short, ushort, , int, uintlong, ulong, floatdouble, , , decimalo nintnuint
breve int, , longfloat, double, decimalonint
ushort int, uint, , long, ulongfloat, double, decimalo nintnuint
int long, float, double, decimal o nint
uint long, , ulongfloat, double, decimalonuint
long float, double o decimal
ulong float, double o decimal
float double
nint long, float, doubleo decimal
nuint ulong, float, doubleo decimal

Annotazioni

Le conversioni implicite da int, uint, long, ulong, nint, o nuint a float e da long, ulong, ninto nuint a double possono causare una perdita di precisione, ma mai una perdita di ordine di grandezza. Le altre conversioni numeriche implicite non perdono mai informazioni.

Si noti anche che

  • Qualsiasi tipo numerico integrale è convertibile in modo implicito in qualsiasi tipo numerico a virgola mobile.

  • Non esistono conversioni implicite nei byte tipi e sbyte . Non esistono conversioni implicite dai double tipi e decimal .

  • Non esistono conversioni implicite tra il decimal tipo e i float tipi o double .

  • Un valore di un'espressione costante di tipo int (ad esempio, un valore rappresentato da un valore letterale integer) può essere convertito in modo implicito in sbyte, byteshort, ushortulonguint, ninto nuint se è compreso nell'intervallo del tipo di destinazione:

    byte a = 13;
    byte b = 300;  // CS0031: Constant value '300' cannot be converted to a 'byte'
    

Se il valore costante non rientra nell'intervallo del tipo di destinazione, si verifica un errore del compilatore CS0031 .

Conversioni numeriche esplicite

La tabella seguente illustra le conversioni esplicite predefinite tra i tipi numerici predefiniti per i quali non è presente alcuna conversione implicita:

Da Per
sbyte byte, ushort, uint, ulong o nuint
byte sbyte
breve sbyte, , byteushort, uint, ulongonuint
ushort sbyte, byte o short
int sbyte, byte, short, ushortuint, , ulong, onuint
uint sbyte, , byteshort, ushort, intonint
long sbyte, byte, , short, ushortint, uint, ulongo nintnuint
ulong sbyte, byte, , short, ushortint, uint, longo nintnuint
float sbyte, byte, , short, ushortint, uint, longulong, , , decimalo nintnuint
doppio sbyte byte, short, , ushortint, uint, long, ulong, float, decimal, nint, onuint
decimal sbyte byte, short, , ushortint, uint, long, ulong, float, double, nint, onuint
nint sbyte, byte, , shortushort, int, uinto ulongnuint
nuint sbyte, byte, , shortushort, int, uinto longnint

Annotazioni

Una conversione numerica esplicita può comportare la perdita di dati o generare un'eccezione, in genere un oggetto OverflowException.

Si noti anche che:

  • Quando si converte un valore di un tipo integrale in un altro tipo integrale, il risultato dipende dal contesto di controllo dell'overflow. In un contesto controllato la conversione ha esito positivo se il valore di origine è compreso nell'intervallo del tipo di destinazione. In caso contrario, verrà generata un'eccezione OverflowException. In un contesto deselezionato, la conversione ha sempre esito positivo e procede come segue:

    • Se il tipo di origine è maggiore del tipo di destinazione, il valore di origine viene troncato rimuovendo i bit più significativi "extra". Il risultato viene quindi trattato come un valore del tipo di destinazione.
    • Se il tipo di origine è minore del tipo di destinazione, il valore di origine è esteso o esteso a zero in modo che corrisponda alla stessa dimensione del tipo di destinazione. L'estensione del segno viene usata se il tipo di origine è firmato; zero-extension viene usato se il tipo di origine non è firmato. Il risultato viene quindi trattato come un valore del tipo di destinazione.
    • Se il tipo di origine ha le stesse dimensioni del tipo di destinazione, il valore di origine viene considerato come valore del tipo di destinazione.
  • Quando si converte un decimal valore in un tipo integrale, questo valore viene arrotondato verso zero al valore integrale più vicino. Se il valore integrale risultante non è compreso nell'intervallo del tipo di destinazione, viene generata un'eccezione OverflowException .

  • Quando si converte un double valore o float in un tipo integrale, questo valore viene arrotondato verso zero al valore integrale più vicino. Se il valore integrale risultante non è compreso nell'intervallo del tipo di destinazione, il risultato dipende dal contesto di controllo dell'overflow. In un contesto controllato viene generata un'eccezione OverflowException , mentre in un contesto non selezionato, il risultato è un valore non specificato del tipo di destinazione.

  • Quando si esegue la conversione double in , il float valore viene arrotondato al valore più doublefloatvicino. Se il double valore è troppo piccolo o troppo grande per adattarsi al float tipo, il risultato è zero o infinito.

  • Quando si esegue la conversione float o double in decimal, il valore di origine viene convertito in decimal rappresentazione e arrotondato al numero più vicino dopo il 28° separatore decimale, se necessario. A seconda del valore di origine, può verificarsi uno dei risultati seguenti:

    • Se il valore di origine è troppo piccolo da rappresentare come , decimalil risultato diventa zero.
    • Se il valore di origine è NaN (non un numero), infinito o troppo grande da rappresentare come , viene generata un'eccezione decimalOverflowException .
  • Quando si esegue la conversione decimal in float o double, il valore di origine viene arrotondato rispettivamente al valore o float più double vicino.

Specificazione del linguaggio C#

Per altre informazioni, vedere le sezioni seguenti delle specifiche del linguaggio C#:

Vedere anche