2014-05-01 48 views
7

Voglio solo essere sicuro che io non sono stato codifica per troppo tempo ... Ma questo sembra altamente improbabile:ReSharper segnalazioni relative ad una stringa nulla (System.NullReferenceException)

string System.NullReferenceExceptionhttp://i.imgur.com/TBjpNTX.png

I crea il var, controlla il null, restituisce se lo è, quindi non c'è modo che io possa vederlo come null in quel punto :)

Bug del programma di ricerca?

Edit:
Come per Igal Tabachnik risposta, ha ragione, sto usando il metodo seguente estensione:

public static bool IsNullOrEmpty(this string target) 
{ 
    return String.IsNullOrEmpty(target); 
} 

Trovo molto più facile da leggere

if (some_string.IsNullOrEmpty()) 
    // do something here 

anziché:

if (string.IsNullOrEmpty(some_string)) 
    // do something here 

Soluzione:
Igal Tabachnik aveva ragione. Gli unici 2 pezzi mancanti erano:

  1. Decodificatore -> Opzioni -> Annotazioni di codice (sotto Gruppo di ispezione codice) -> attivare per soluzione.
  2. Dai a VS un paio di minuti per rinfrescare tutto.
+1

Non è un bug.[Analisi ReSharper NullReferenceException e relativi contratti] (http://blog.jetbrains.com/dotnet/2010/11/17/resharper-nullreferenceexception-analysis-and-its-contracts/) –

+0

Inoltre: [ReSharper: come rimuovere " Possibile avviso 'System.NullReferenceException' "(http://stackoverflow.com/questions/4393456/resharper-how-to-remove-possible-system-nreferencereferenceexception-warning) –

risposta

10

Il codice suggerisce che il metodo IsNullOrEmpty() utilizzato è il proprio metodo di estensione personalizzato. Il "reale" IsNullOrEmpty è un metodo statico di string.

Risposta breve: se si cambia a

if (string.IsNullOrEmpty(input_string)) 
    return "..."; 

ReSharper si smettere di lamentarsi.

Risposta lunga: Poiché questo è il proprio metodo di estensione, ReSharper non ha modo di sapere come il risultato di questo metodo si applica al codice. Per questo, ReSharper utilizza le annotazioni del codice per capire ulteriori informazioni sul codice. Una di queste annotazioni è denominata Contract Annotation ed è ciò che ReSharper utilizza per calcolare il risultato del metodo originale string.IsNullOrEmpty(). Puoi leggere di più su questo nel post del blog.

Linea di fondo, se si vuole utilizzare il proprio metodo di estensione, ma hanno ReSharper ben capito, si deve applicare la seguente annotazione contratto su di esso:

[ContractAnnotation("null=>true")] 
public static bool IsNullOrEmpty(this string input) 
{ 
    ... 
} 
+0

+1 per risolvere il problema mantenendo la sua estensione originale metodo. E anche per Porcupine Tree;) –

+0

Wow, davvero una bella soluzione. +1 di sicuro. –

+0

Questo è molto interessante :). Il tuo primo suggerimento è al 100% sul denaro, e usando 'string.IsNullOrEmpty (my_string)' liberati di esso. Domanda aggiornata con il mio codice. L'annotazione sul metodo di estensione però non fa sparire l'avviso. Vado a leggere i link che hai postato :) Buona risposta in entrambi i casi. – Noctis

4

tuo IsNullOrEmpty() -Metodo sembra essere un propria invenzione poiché quella originale è un metodo statico di System.String e non un metodo di estensione. ReSharper non è in grado di capirlo, ma se usi quello originale vedrà che nessun valore di null può farcela.

var str = value as string; 

if (string.IsNullOrEmpty(str)) 
    return; 

var unicorn = str.Contains("unicorn"); 
+0

Assicurati di utilizzare una "S" maiuscola in String.IsNullOrEmpty – Matthijs

+2

@Matthijs Perché? Entrambi sono completamente validi e compili a 'System.String'. –

+0

@dav_i: giuro che ho appena visto che IsNullOrEmpty non è disponibile per la stringa minuscola. Il mio errore, scusa! – Matthijs

Problemi correlati