2010-05-14 19 views
7

Ho il seguente codice:tipo nullable e ReSharper avvertimento

private static LogLevel? _logLevel = null; 

public static LogLevel LogLevel 
{ 
    get 
    { 
     if (!_logLevel.HasValue) 
     { 
      _logLevel = readLogLevelFromFile(); 
     } 

     return _logLevel.Value; 
    } 
} 

private static LogLevel readLogLevelFromFile() { ... } 

Ho ricevuto un avviso ReSharper sulla dichiarazione return su un possibile System.InvalidOperationException e suggerisce verifico _logLevel per vedere se è null prima. Tuttavia, readLogLevelFromFile restituisce LogLevel, non LogLevel?, quindi non è possibile raggiungere la dichiarazione return quando _logLevel è null. È solo una svista di ReSharper o mi manchi qualcosa?

+2

Non ricevo questo avviso utilizzando la v4.5. Quale versione di ReSharper stai usando? – Brandon

+0

Build 5.0.1659.36. –

risposta

5

Sembra un errore in Resharper.

Si noti, tuttavia, che non è thread-safe.

The best way to do this is to use a static initializer, in questo modo:

public static LogLevel Instance { get { return Nested.level; } } 

class Nested { 
    // Explicit static constructor to tell C# compiler 
    // not to mark type as beforefieldinit 
    static Nested() { } 

    internal static readonly LogLevel level = readLogLevelFromFile(); 
} 
+1

che cambierà quando è istanziato + caricarlo se non è utilizzato per tutto – eglasius

+0

'Impossibile risolvere il simbolo 'Istanza''. Intendevi fare un 'nuovo Nested()' lì? –

+0

@Sarah: intendevo '.level'. Dovrebbe funzionare ora. – SLaks

4

Si potrebbe refactoring in qualcosa di simile:

return (_logLevel = _logLevel ?? readLogLevelFromFile()).Value; 

In alternativa è possibile utilizzare il costruito nel tipo pigro (Richiede .NET 4.0 o si può rotolare il tuo.):

public static LogLevel LogLevel 
{ 
    get { return _logLevel.Value; } 
} 
private static Lazy<LogLevel> _logLevel = new Lazy<LogLevel>(readLogLevelFromFile); 
+0

Che effettivamente dà l'errore del compilatore 'Impossibile convertire implicitamente il tipo 'MyNS.LogLevel?' a "MyNS.LogLevel". Esiste una conversione esplicita (ti manca un cast?) '. –

+0

@Sarah - Opps, ho dimenticato la chiamata a 'Value'. – ChaosPandion

+0

Questo è ancora più compatto di quello che ho; Grazie! –

0

Resharper non era "intelligente" abbastanza da capirlo per te u. È una specie di cosa complessa da capire, immagino.

Preferisco il refactoring di @ ChaosPandion comunque ...

Problemi correlati