¿Por qué es válido este elenco?
Un reparto es válido si se conoce en tiempo de compilación que la conversión podría tener éxito o siempre tiene éxito. Los lanzamientos solo son ilegales cuando la conversión no puede tener éxito. (Por ejemplo, enviar un tipo sellado a una interfaz que no implementa). Una conversión de doble a larga podría tener éxito. Por lo tanto, el elenco es válido.
¿Por qué no deja de ejecutarse (arroje una excepción, por ejemplo) en lugar de asignar un valor arbitrario?
¡Porque no pidió una excepción!La especificación es extremadamente clara sobre cuál es el comportamiento esperado. Véase la sección 6.2.1:
Para una conversión de flotador o doble a un tipo integral, el procesamiento depende del desbordamiento de la comprobación contexto en el que la conversión se lleva a cabo:
En un contexto comprobado, la conversión procede de la siguiente manera:
• Si el valor del operando es NaN o infinito, se lanza una System.OverflowException.
[...]
En un contexto no se controla, la conversión siempre tiene éxito, y se procede de la siguiente manera.
• Si el valor del operando es NaN o infinito, el resultado de la conversión es un valor no especificado del tipo de destino.
Está ejecutando el código en un contexto sin marcar; no has pedido ninguna excepción, así que no obtienes ninguna excepción. Si quieres una excepción, pide una; usa un contexto verificado
¿Ha intentado ver el 'MSIL' generado por ese código? –
Paginación Eric Lippert ... Eric Lippert por favor acércate a la recepción. –
En C#, ¿ese tipo de yeso solo tiene un efecto como lo haría en C, que es solo determinar cómo debe interpretarse el almacenamiento en bruto? – Pointy