2012-07-25 7 views
6

tengo una regla en ReSharper para encontrar llamadas a Nullable.HasValuereemplazo patrón personalizado ReSharper con la expresión de la igualdad negativo

T? foo; 
//... 

if(foo.HasValue) 
{} 

//And it offers to replace with a comparison directly with null: 

if(foo != null) 
{} 

Esto funciona muy bien, pero cuando se encuentra con un negada .HasValue, el resultado es un poco extraño.

if(!foo.HasValue) {} 

//is replaced with 
if(!(foo != null)) {} 

Entonces ReSharper quiere que simplifican la declaración a solo if(foo == null)

//ideally it would automatically get to this without the extra step: 
if(foo == null) {} 

La regla se define como:

type:  System.ValueType or derived 
nullable: expression of type System.Nullable<$type$> 

search pattern: 
$nullable$.HasValue 

replace pattern: 
$nullable$ != null 

('Formato después de reemplazo' y 'Acortar referencias' son ambos marcados)

¿Hay alguna forma de que pueda escribir esta regla para que ReSharper maneje inteligentemente? Intenté hacer una segunda regla para !$nullable$.HasValue, pero eso hace que ambas reglas coincidan, lo que hace que las sugerencias de sugerencias parezcan confusas: replace with == null y replace with != null.

+0

No sé la solución. Solo una idea y supongo que ya pensaste en ello: elimina el patrón para '! Foo.HasValue' y agrega solo patrones para' foo.HasValue' y '! (Foo! = Null)'. Por lo tanto, solo hay una regla a la vez, pero desafortunadamente necesita utilizar ** dos ** patrones consecutivos para el código como '! Foo.HasValue'. – thersch

+0

Los patrones de búsqueda contienen solo reglas positivas. Ya me perdí varias veces la posibilidad de definir reglas negativas para excluir un código especial para un patrón. – thersch

+0

Los patrones personalizados Resharper son bastante difíciles de resolver, ojalá hubiera un motor de patrones personalizados de prueba con el que pudiera ejecutar algunas expresiones conocidas y malas contra – Maslow

Respuesta

0

Si no es obligatoria puede renunciar a esta regla, ya que, según este post:.

"El compilador reemplaza comparaciones nulos con una llamada a HasValue, por lo que no hay ninguna diferencia real Sólo haz lo que sea más legible/tiene más sentido para usted y sus colegas ".

+1

Entendido, pero mi motivación es que creo que las comparaciones nulas son más legibles, y quiero que Resharper haga cumplir esa decisión de estilo. – dan

Cuestiones relacionadas