2010-07-16 17 views
6

Perché in C# è un esempio A valido, compilabile e verrà eseguito solo mentre gli esempi B non verranno compilati?eccezione aritmetica in C#

Un

int val = 0; 
val = val + Int32.MaxValue +2; 

o

int val = Int32.MaxValue; 
val++; 

B

int val = 0; 
val = 2147483647 + 1; 

o

int val = 0; 
int val = Int32.MaxValue + 1; 

so per impostazione predefinita, le eccezioni aritmetiche non vengono verificate per impostazione predefinita a meno che non lo si faccia esplicitamente utilizzando il metodo, il blocco o l'attributo verificato nella configurazione. La mia domanda riguarda più al compilatore, quindi come avviene un'eccezione aritmetica.

+1

Penso che ti sei perso qualcosa durante la pubblicazione della domanda. Cosa significa "La mia domanda riguarda più __________"? – bits

+0

@bits sì ho fatto applausi –

risposta

16

Gli esempi B sono constant-folded in fase di compilazione, che indica al compilatore che è garantito l'overflow.

Poiché gli esempi A utilizzano variabili, le espressioni non possono essere piegate (completamente) costantemente, pertanto il compilatore non può garantire che i valori generino un overflow.

Per esempio ...

int val = 0; 
// some other thread changes `val` to -5... 
val = val + Int32.MaxValue +2; // no overflow 

Tuttavia, se si sa che val non cambierà, e assegnare 0 a un const int:

const int startval = 0; 
int val = startval + Int32.MaxValue + 2; 

È possibile ottenere la vostra di compilazione overflow del tempo ricontrollare perché il valore può essere completamente determinato e quindi piegato costantemente.

1

Ha semplicemente a che fare con i limiti del controllo del tempo di compilazione. Alcune cose possono essere conosciute solo in fase di esecuzione.

3

So che le eccezioni aritmetiche non vengono controllati per default a meno che non esplicitamente farlo utilizzando controllato metodo, blocco o attributo nel config

Lei non sanno che perché questa affermazione è corretta. E in effetti sai che non è corretto perché hai fornito un caso in cui la tua affermazione è dimostrata falsa!

vi rimando alla sezione 7.6.12 delle specifiche C#, una parte dei quali riproduco qui per comodità:

Per le espressioni non costanti (espressioni che vengono valutate in fase di esecuzione), che non sono racchiusi tra gli operatori o le istruzioni selezionate o deselezionate, il contesto di controllo dell'overflow predefinito è deselezionato a meno che fattori esterni (come gli switch del compilatore e la configurazione dell'ambiente di esecuzione) richiedano una valutazione controllata.

Per le espressioni costanti (espressioni che possono essere completamente valutate in fase di compilazione), il contesto di controllo di overflow predefinito viene sempre controllato.A meno che un'espressione costante non venga esplicitamente inserita in un contesto non controllato, gli overflow che si verificano durante la valutazione dell'espressione in fase di compilazione causano sempre errori di compilazione.

Vedere le specifiche per ulteriori dettagli.

+0

discreto, questa affermazione dovrebbe dire "in fase di esecuzione" –