2010-05-14 49 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() { ... } 

我上return語句ReSharper的警告對可能System.InvalidOperationException和它表明我檢查_logLevel,看它是否是null第一。但是,readLogLevelFromFile返回LogLevel而不是LogLevel?,因此當_logLevelnull時,無法達到return語句。這只是ReSharper的疏忽,還是我錯過了什麼?

+2

我沒有得到這個警告使用v4.5。你使用的是什麼版本的ReSharper? – Brandon 2010-05-14 16:14:22

+0

Build 5.0.1659.36。 – 2010-05-14 16:18:55

回答

5

這看起來像是Resharper中的一個bug。

但是請注意,這不是線程安全的。

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 2010-05-14 16:17:47

+0

'無法解析符號'實例'。你有意在那裏做一個新的Nested()嗎? – 2010-05-14 16:22:31

+0

@Sarah:我的意思是'.level'。它現在應該工作。 – SLaks 2010-05-14 16:24:36

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'。存在明確的轉換(您是否缺少演員?)'。 – 2010-05-14 16:17:18

+0

@Sarah - 奧普斯,我忘了給'價值'的電話。 – ChaosPandion 2010-05-14 16:18:29

+0

這比我所擁有的更加緊湊。謝謝! – 2010-05-14 16:21:01

0

resharper是不是'聰明'足以找出喲ü。我會想象出這是一件很複雜的事情。

我更喜歡@ ChaosPandion的重構反正...