可空类型和ReSharper警告

时间:2010-05-14 16:10:09

标签: c# null resharper nullable

我有以下代码:

private static LogLevel? _logLevel = null;

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

        return _logLevel.Value;
    }
}

private static LogLevel readLogLevelFromFile() { ... }

我在return声明中收到有关可能的System.InvalidOperationException的ReSharper警告,并建议我先检查_logLevel是否null。但是,readLogLevelFromFile会返回LogLevel,而不是LogLevel?,因此当return_logLevel时,无法联系到null语句。这只是ReSharper的疏忽,还是我错过了什么?

3 个答案:

答案 0 :(得分: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 :(得分: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);

答案 2 :(得分:0)

Resharper不够“聪明”,足以为你解决问题。我想,这是一件很复杂的事情。

我更喜欢@ ChaosPandion的重构......