2010-05-14 86 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的重构反正...