visual studio see remarks para name cref comment c# casting exception-handling

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 de long a int .

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