2010-05-14 10 views
7

Je le code suivant:type Nullable et un ReSharper avertissement

private static LogLevel? _logLevel = null; 

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

     return _logLevel.Value; 
    } 
} 

private static LogLevel readLogLevelFromFile() { ... } 

Je reçois un avertissement de ReSharper sur la déclaration return au sujet d'un possible System.InvalidOperationException et il suggère que je vérifie _logLevel pour voir si elle est null d'abord. Toutefois, readLogLevelFromFile renvoie LogLevel, et non LogLevel?, il est donc impossible d'atteindre l'instruction return lorsque _logLevel est null. Est-ce juste un oubli de ReSharper, ou est-ce que je manque quelque chose?

+2

Je ne reçois pas cet avertissement en utilisant v4.5. Quelle version de ReSharper utilisez-vous? – Brandon

+0

Build 5.0.1659.36. –

Répondre

5

Cela ressemble à un bug dans Resharper.

Notez, cependant, que ce n'est pas thread-safe.

The best way to do this is to use a static initializer, comme ceci:

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

qui va changer quand il est instancié + le charger s'il n'est pas du tout utilisé – eglasius

+0

'Impossible de résoudre le symbole 'Instance''. Voulais-tu faire un 'nouveau Nested()' là? –

+0

@Sarah: Je voulais dire '.level'. Cela devrait fonctionner maintenant. – SLaks

4

Vous pouvez factoriser dans quelque chose comme ceci:

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

Vous pouvez également utiliser le type construit paresseux (ou .NET 4.0 requis vous pouvez rouler le vôtre.):

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

Cela donne réellement l'erreur du compilateur 'ne peut pas implicitement convertir le type 'MyNS.LogLevel?' à 'MyNS.LogLevel'. Une conversion explicite existe (manque-t-il une distribution?) '. –

+0

@Sarah - Opps, j'ai oublié l'appel à 'Value'. – ChaosPandion

+0

C'est encore plus compact que ce que j'ai; Merci! –

0

Resharper n'était pas assez intelligent pour le comprendre u. C'est une chose complexe à comprendre, j'imagine.

Je préfère de toute façon refactoriser @ ChaosPandion ...