2010-02-25 6 views
7

¿Hay una manera de configurar el VS2008 compilador de C# para dar una advertencia de código como este:¿Puede el compilador Can C# configurarse para dar advertencia cuando el lanzamiento explícito puede causar la pérdida de datos?

Int64 x = 123456789000; 
Int32 y = (Int32)x; 
+8

¿No es el hecho de que tiene que usar una advertencia de conversión explícita suficiente al escribir el código?El reparto explícito generalmente le dice al compilador "Oye, sé lo que estoy haciendo". – Joey

+0

Tenemos un código que está haciendo algunos moldes explícitos que causan la pérdida de datos. Necesitamos limpiarlo. Tenía la esperanza de que hubiera una opción de compilación que pudiéramos configurar que pudiera ayudarnos a encontrar estos casos. C++ tiene una advertencia para esto; Pensé que C# podría tener algo. – HBFan

Respuesta

0

ir a la vista de propiedades de un proyecto, haga clic en la pestaña Generar, haga clic en el botón Avanzado en la parte inferior derecha , comprobar la "comprobación para la aritmética desbordamiento/subdesbordamiento" casilla de verificación

+2

Esto hará que se inserte un código de comprobación de desbordamiento que da como resultado una excepción de tiempo de ejecución, no una advertencia de tiempo de compilación. – Joey

2

el compilador no puede hacer eso en tiempo de compilación, pero se puede configurar para lanzar Excepciones en tiempo de ejecución,

en el proyecto-propiedades-> Construir -> Avanzado -> Comprobar desbordamiento \ underflow

10

El objetivo de un reparto explícito es decir que "me hago cargo del problema, simplemente hazlo".

En su caso trivial, tal vez sería fácil para el compilador descubrir que el valor no cabría en un Int32, y así producir su advertencia.

Sin embargo, ¿qué pasa con esto:

Int64 x = CallSomeMethod(); 
Int32 y = (Int32)x; 

¿Cómo puede advertirle sobre esto? ¿Debería:

  1. intentar averiguar qué tipo de rango podría devolver el valor de CallSomeMethod?
  2. siempre advierten? (Entonces, ¿cuál sería el punto?)

Lo mejor que puede esperar aquí es tener una verificación de tiempo de ejecución, o similar, el compilador no puede evitar que todo lo que podría salir mal.

5

Todo necesario puede causar la pérdida de datos. El propósito de un reparto es decirle al compilador: "Estoy haciendo algo peligroso aquí que no puedes analizar, pero sé lo que estoy haciendo". Dado que todo el propósito de un elenco es manejar un caso que el compilador no es lo suficientemente inteligente como para analizarlo, parece inútil esperar que el compilador lo analice para dar una advertencia.

Por lo tanto, su propuesta es efectivamente hacer una advertencia para cada molde necesario, lo que parece contraproducente.

Observo que una conversión implícita también puede causar la pérdida de datos en algunos casos excepcionales. Las conversiones implícitas pueden perder bits de precisión ; lo que conserva una conversión implícita es magnitud.

1

Estoy de acuerdo con Lasse V. Karlsen's explicación explícita del reparto.

Una posible solución para usted en este caso es realmente eliminar los moldes explícitos (encontrarlos y reemplazarlos) en su código si realmente desea tener "advertencias" cuando existe un molde como ese. Lo haría significa que debería pasar manualmente todos los lanzamientos que ocurrieron (en la lista de advertencias) y determinar si son válidos o no. para que su código se vea así:

Int64 x = 123456789000; 
Int32 y = x; 
Cuestiones relacionadas