2015-12-18 9 views
5

Perché ricevo un errore di compilazione qui:Integer eccezione di overflow

int a = 2147483647 + 10; 

e non qui, se sto eseguendo la stessa operazione:

int ten = 10; 
int b = 2147483647 + ten; 

Sto imparando l'utilizzo di controllato e il sito Web MSDN non cancella il motivo per cui OverflowException viene generato nel primo snippet di codice:

errore, un'espressione che contiene solo valori costanti causa un errore del compilatore se l'espressione produce un valore che si trova all'esterno dell'intervallo del tipo di destinazione. Se l'espressione contiene uno o più valori non costanti , il compilatore non rileva l'overflow.

Spiega solo il comportamento ma non i motivi di tale comportamento. Mi piacerebbe sapere cosa succede sotto il cofano.

+1

Si sta verificando un errore del compilatore, non un'eccezione nel primo caso. – CodesInChaos

risposta

9

La ragione è quando si dispone int a = 2147483647 + 10; compilatore in grado di prevedere il risultato della dichiarazione (a) e si sa che esso provoca troppo pieno perché entrambi e sono costanti ed i loro valori sono noti al momento della compilazione.

Ma quando hai

int ten = 10; 
int b = 2147483647 + ten; 

qualche altro thread (o qualcosa d'altro, forse un mago, forse un pericolo in memoria ...) possono avere modificare il valore della ten prima dell'esecuzione di int b = 2147483647 + ten; economico e della l'overflow non può essere previsto in fase di compilazione.

+1

Vinto da 30 secondi ... sei veloce. +1 –

+0

ok allora, il compilatore si lamenta quando valuta entrambi i numeri ma non quando valuta il numero e la variabile "dieci". Sei obbligato a utilizzare l'opzione selezionata per riconoscere l'overflow in quel caso. È un po 'di incoerenza, no? – Rober

+1

Se si desidera lo stesso comportamento (in fase di esecuzione) è sufficiente selezionare la casella nelle impostazioni del progetto per renderlo "controllato" per impostazione predefinita invece "deselezionato" oppure avvolgere il codice in un blocco selezionato 'checked {int ten = 10; int b = 2147483647 + dieci; } ', anche questo genererà lo stesso errore in fase di esecuzione. Non è possibile ottenere il comportamento al momento della compilazione. –