2012-07-23 2 views
11

Qualcuno può pensare a buon modello ReSharper che rileverà il seguente errore:modello ReSharper per rilevare l'aritmetica con i tipi nullable

decimal? x = null; 

decimal? y = 6M; 

var total = x + y; 

Console.WriteLine(total); // Result is null 

Ho cercato di creare un modello, ma non riesco a capire come gestire rapidamente tutti i tipi di aritmetica (ad es. +, -, * ecc.) e qualsiasi tipo annullabile (e.g. Nullable<int>, Nullable<decimal>, Nullable<double> etc). Inoltre, non posso gestire la commutatività (ad es. Dovrebbe rilevare x + y e y + x).

Nota che non è necessario determinare se x è effettivamente nullo: solo se si tratta o meno di un tipo nullable. Voglio forzare gli sviluppatori a scrivere: x.Value + y.Value.

+0

erm nullable è solo una classe generica. Nullable Struttura perché non fanno di questo modello thingy su: "Nullable " – Nahum

+0

E non verificare la presenza di una x + modello 'y', ma cercare un' 'Nullable che è stato sicuramente assegnato con' null' e non ha nessuno di '+', '-',' * ','/','^',' * ',' ~ ',' <<','>> 'a sinistra oa destra di esso (o' - = ' , '+ =', ... a sinistra). – SimpleVar

+0

@Nahum Non funziona. – cbp

risposta

3

Questa non è una risposta completa, ma questo è il migliore che ho trovato finora.

Lo schema è:

$obj$ + $nullableObj$ 

obj è un "espressione di tipo System.Object o uno dei suoi tipi derivati ​​ nullableObj è" un'espressione di tipo System.Nullable (Si noti che non si desidera che nullableObj includa tipi derivati)

Questa non è una soluzione molto buona perché il modello non gestire commutativa, quindi è necessario copiare e incollare e invertire le espressioni:

$nullableObj$ + $obj$ 

Inoltre, questo modello gestisce solo decimale, quindi è necessario copiare e incollare per ogni tipo che ti interessano (sì, questo è potenzialmente un sacco di schemi).

Una buona notizia: il simbolo + gestisce sia l'addizione che la sottrazione, quindi non è necessario preoccuparsi della sottrazione.