2010-05-14 3 views
7

У меня есть следующий код:обнуляемым типа и ReSharper предупреждение

private static LogLevel? _logLevel = null; 

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

     return _logLevel.Value; 
    } 
} 

private static LogLevel readLogLevelFromFile() { ... } 

я получаю предупреждение ReSharper на return заявление о возможном System.InvalidOperationException и предлагает проверить _logLevel, чтобы увидеть, если это null первым. Однако readLogLevelFromFile возвращает LogLevel, а не LogLevel?, поэтому нет необходимости делать заявление return, если _logLevel - null. Это просто недосмотр ReSharper, или я что-то упускаю?

+2

Я не получаю это предупреждение с помощью v4.5. Какую версию ReSharper вы используете? – Brandon

+0

Build 5.0.1659.36. –

ответ

5

Это похоже на ошибку в Resharper.

Обратите внимание, что это не является потокобезопасным.

The best way to do this is to use a static initializer, как это:

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

, который изменится, когда его экземпляр + загрузит его, если он вообще не используется – eglasius

+0

'Не удается разрешить символ« Экземпляр ». Вы хотели сделать «новый Nested()» там? –

+0

@Sarah: Я имел в виду '.level'. Теперь он должен работать. – SLaks

4

Вы можете реорганизовать его в нечто вроде этого:

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

В качестве альтернативы вы можете использовать встроенный в ленивого типа (требуется .NET 4.0 или вы можете свернуть ваш собственный.):

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

Это фактически дает ошибку компилятора 'Невозможно неявно преобразовать тип 'MyNS.LogLevel?' в «MyNS.LogLevel». Явное преобразование существует (вы пропускаете листинг?) '. –

+0

@Sarah - Opps, я забыл позвонить 'Value'. – ChaosPandion

+0

Это еще более компактно, чем у меня; благодаря! –

0

Resharper не был «умным», чтобы понять его за лет и. Я бы предположил, что это сложная вещь.

Я предпочитаю @ рефакторинга ChaosPandion в любом случае ...

Смежные вопросы