studio - summary c#
La declaración en línea de C#no funciona (3)
Eso es porque lo estás convirtiendo a long
. Si no se selecciona (maxValue + 1)
se -2147483648
que se almacenarán en el lanzamiento long
y -2147483648
vuelta a int
. Por lo tanto, después de emitir intValue
sus tiendas -2147483648
En su lugar, intente como se muestra a continuación y se generará una OverflowException
int intValue = checked(maxValue + 1);
(o incluso
long longValue = checked((maxValue + 1));
Tengo dos métodos de prueba. El primero funciona bien. El segundo no lanza una excepción, pero debería hacerlo. ¿Por qué el segundo no lanza una excepción?
[TestMethod]
[ExpectedException(typeof(OverflowException))]
public void LongToInt_OverflowWithCheckedBlock()
{
checked
{
int maxValue = 2147483647;
long longValue = (maxValue + 1);
int intValue = (int)longValue;
}
}
[TestMethod]
[ExpectedException(typeof(OverflowException))]
public void LongToInt_OverflowWithCheckedStatement()
{
int maxValue = 2147483647;
long longValue = (maxValue + 1);
int intValue = checked((int)longValue); // No Exception is thrown, why?
}
La razón por la que el primero lanza y el segundo no es porque su comparación está un poco fuera de lugar.
- En el 1er método se
check
todo. - En el segundo método solo
check
el reparto delong
aint
.
Si los comparas como a continuación son iguales y ninguno tirará:
private static void MethodA()
{
int maxValue = 2147483647;
long longValue = ( maxValue + 1 );
checked
{
int intValue = ( int ) longValue;
}
}
private static void MethodB()
{
int maxValue = 2147483647;
long longValue = ( maxValue + 1 );
int intValue = checked( ( int ) longValue);
}
La razón de esto es porque esta línea: int intValue = checked(( int ) longValue);
no es el que está tirando, es esta línea:
long longValue = ( maxValue + 1 );
Si pongo el cheque allí ambos tirarán:
long longValue = checked( maxValue + 1 );
Por qué se tira aquí:
Se lanza porque ( maxValue + 1 )
está agregando 1 a un int
llamado maxValue
(aquí ocurre la excepción) y después de eso, asignarlo a un long
, si cast
el int
a long
antes de hacer el agregado de 1, no se lanzará:
long longValue = ( (long) maxValue + 1 );
Como dice el documento de MSDN ,
La palabra clave marcada se usa para habilitar explícitamente la verificación de desbordamiento para operaciones aritméticas de tipo integral y conversiones.
El primer método de prueba ya está comprobando si hay un valor de desbordamiento dentro del bloque declarado .
El segundo método de prueba solo verifica el valor de desbordamiento en esta línea de código solamente.
int intValue = checked((int)longValue); //Checked expression
Como el desbordamiento se produce antes de la expresión checked
, el CLR ya convirtió el valor. Y el valor de eso es -2147483648
que es legal ya que el rango int es
¿Cuál es la diferencia?
Método de prueba 1: bloque comprobado
Método de prueba 2: Expresión marcada