2010-07-16 14 views
6

¿Por qué en C# es un ejemplo válido, compilable y se ajustará mientras que los ejemplos B no se compilarán?excepción aritmética en 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; 

sé de forma predeterminada, las excepciones aritméticas no se verifican de forma predeterminada a menos que lo haga explícitamente utilizando el método, el bloque o el atributo marcado en la configuración. Mi pregunta se relaciona más con el compilador y luego cómo ocurre una excepción aritmética.

+1

Creo que te perdiste de todo al publicar una pregunta. ¿Qué es después de "Mi pregunta se relaciona más con __________"? – bits

+0

@bits sí lo hice ovaciones –

Respuesta

16

Sus ejemplos B son constant-folded en tiempo de compilación, lo que indica al compilador que está garantizado que se desbordará.

Como los ejemplos A usan variables, las expresiones no se pueden plegar (completamente) de forma constante, por lo que el compilador no puede garantizar que los valores generen un desbordamiento.

Por ejemplo ...

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

Sin embargo, si usted sabe que val no va a cambiar, y asignar 0 a un const int:

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

Usted puede conseguir su de compilación verificación de desbordamiento de tiempo porque el valor puede determinarse por completo y, por lo tanto, plegarse constantemente.

1

Simplemente tiene que ver con las limitaciones de la comprobación del tiempo de compilación. Ciertas cosas solo pueden conocerse en tiempo de ejecución.

3

Sé que excepciones aritméticas no se comprueban de forma predeterminada a menos que explícitamente así que usando comprobado método, bloque o atributo en la configuración

Usted no saben que debido a que la declaración es incorrectos. ¡Y de hecho sabes que es incorrecto porque has presentado un caso en el que tu declaración es falsa!

remito a la sección 7.6.12 de la especificación de C#, una parte del cual reproduzco aquí para su conveniencia:

Para expresiones no constantes (expresiones que se evalúan en tiempo de ejecución) que no están encerrados por ningún operador o afirmación marcada o no, el contexto de comprobación de desbordamiento predeterminado no está seleccionado a menos que factores externos (como los modificadores del compilador y la configuración del entorno de ejecución) requieran una evaluación comprobada.

Para expresiones constantes (expresiones que se pueden evaluar completamente en tiempo de compilación), el contexto de comprobación de desbordamiento predeterminado siempre está marcado.A menos que una expresión constante se coloque explícitamente en un contexto no verificado, los desbordamientos que ocurren durante la evaluación en tiempo de compilación de la expresión siempre causan errores en tiempo de compilación.

Consulte la especificación para obtener más información.

+0

Lo suficientemente justo esa afirmación debería decir "en tiempo de ejecución" –