2010-05-14 12 views
7

Tengo el siguiente código:tipo anulable y una advertencia ReSharper

private static LogLevel? _logLevel = null; 

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

     return _logLevel.Value; 
    } 
} 

private static LogLevel readLogLevelFromFile() { ... } 

recibo una advertencia ReSharper en la cuenta de return sobre un posible System.InvalidOperationException y sugiere verifico _logLevel para ver si es null primero. Sin embargo, readLogLevelFromFile devuelve LogLevel, no LogLevel?, por lo que no hay manera de que se llegue a la declaración return cuando _logLevel es _logLevel es . ¿Es solo un descuido de ReSharper, o me estoy perdiendo algo?

+2

No entiendo esta advertencia utilizando v4.5. ¿Qué versión de ReSharper estás usando? – Brandon

+0

compilación 5.0.1659.36. –

Respuesta

5

Parece un error en Resharper.

Tenga en cuenta, sin embargo, que eso no es seguro para subprocesos.

The best way to do this is to use a static initializer, así:

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

que cambiará cuando se lo instancia + lo cargue si no se usa en absoluto – eglasius

+0

'No se puede resolver el símbolo 'Instancia''. ¿Querías hacer un 'nuevo Nested()' allí? –

+0

@Sarah: quise decir '.level'. Debería funcionar ahora. – SLaks

4

Usted podría refactorizar en algo como esto:

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

Alternativamente, puede utilizar el construido en el tipo perezoso (Requiere .NET 4.0 o se puede rodar la suya):

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

Eso en realidad da el error del compilador 'No se puede convertir implícitamente el tipo 'MyNS.LogLevel?' a 'MyNS.LogLevel'. Existe una conversión explícita (¿falta un elenco?) '. –

+0

@Sarah - Opps, olvidé la llamada a 'Value'. – ChaosPandion

+0

Eso es incluso más compacto que lo que tengo; ¡Gracias! –

0

Resharper no era lo suficientemente "inteligente" como para resolverlo tú Es algo complejo de entender, me imagino.

prefiero @ refactorización de ChaosPandion de todos modos ...

Cuestiones relacionadas