2010-02-25 13 views
7

C'è un modo per configurare il # compilatore VS2008 C per dare un avvertimento per codice come questo:Il compilatore C# può essere configurato per fornire un avviso quando il cast esplicito può causare la perdita di dati?

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

Non è il fatto che devi usare un avvertimento di cast esplicito sufficiente quando scrivi il codice?Il cast esplicito di solito dice al compilatore "Ehi, so cosa sto facendo." – Joey

+0

Abbiamo del codice che sta facendo alcuni cast espliciti che causano la perdita di dati. Abbiamo bisogno di ripulirlo. Speravo che esistesse un'opzione di compilazione che potremmo impostare per aiutarci a trovare questi casi. C++ ha un avvertimento per questo; Pensavo che C# potesse avere qualcosa. – HBFan

risposta

0

andare alle proprietà della vista di un progetto, fare clic sulla scheda Genera, fare clic sul pulsante Avanzate in basso a destra , selezionare la casella "verificare per l'aritmetica di overflow/underflow" casella

+2

Ciò causerà l'inserimento del codice di controllo di overflow che si tradurrà in un'eccezione di runtime, non in un avviso in fase di compilazione. – Joey

2

il compilatore non posso fare che al momento della compilazione, ma è possibile configurarlo per gettare exeptions in fase di esecuzione,

Nel progetto-proprietà-> Crea -> Avanzate-> Verifica overflow \ underflow

10

Il punto centrale di un cast esplicito a dire che "mi assumo la responsabilità per il problema, basta farlo".

Nel tuo caso banale, sarebbe forse facile per il compilatore per capire che il valore non si adatterebbe in un Int32, e quindi produrre il vostro avviso.

Tuttavia, che dire di questo:

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

come può avvertire di questo? Nel caso in cui:

  1. cercare di capire che tipo di gamma potrebbe restituire il valore da CallSomeMethod?
  2. avvertire sempre? (Allora quale sarebbe il punto di essere?)

Il meglio che puoi sperare è quello di avere un controllo runtime, o simili, il compilatore non si può impedire da tutto ciò che poteva andare storto.

5

Tutti necessarie calchi potrebbero causare la perdita di dati. Lo scopo di un cast è dire al compilatore "Sto facendo qualcosa di pericoloso qui che non puoi analizzare, ma so cosa sto facendo". Poiché l'intero scopo di un cast è gestire un caso che il compilatore non è abbastanza intelligente da analizzare, aspettarsi che il compilatore lo analizzi per dare un avvertimento sembra inutile.

Pertanto, la tua proposta è effettivamente di fare un avviso per ogni cast necessario, che sembra controproducente.

Rilevo che una conversione implicita può anche causare la perdita di dati in alcuni rari casi. conversioni implicite possono perdere bit di precisione ; ciò che conserva una conversione implicita è magnitudine.

1

Sono d'accordo con la spiegazione esplicita del cast Lasse V. Karlsen's.

Una possibile soluzione per voi in questo caso è quello di realtà rimuovere i cast espliciti (trovare e sostituirli) nel codice, se stai veramente cercando di avere "avvertimenti" quando un cast del genere farebbe exists.It significa che dovresti eseguire manualmente tutti i cast che si sono verificati (nella lista di avvisi) e determinare se sono validi o meno. quindi il tuo codice sarebbe simile a questo:

Int64 x = 123456789000; 
Int32 y = x; 
Problemi correlati