可空类型和ReSharper警告

7

I have the following code:

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
3个回答

5

看起来这是Resharper的一个bug。

然而,请注意这不是线程安全的。

最好的方法是使用静态初始化器,像这样:

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
无法解析符号“Instance”。你是不是想在那里使用“new Nested()”? - Sarah Vessels

4
您可以将其重构为以下内容:
return (_logLevel = _logLevel ?? readLogLevelFromFile()).Value;

或者您可以使用内置的lazy类型(需要.NET 4.0),或者自己创建一个:

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

这实际上会给编译器带来错误无法隐式转换类型'MyNS.LogLevel?'为'MyNS.LogLevel'。存在显式转换(是否缺少强制转换?) - Sarah Vessels
@Sarah - 哎呀,我忘记调用 Value 了。 - ChaosPandion

0

Resharper并不足够“聪明”来为您解决问题。我想这是一个相当复杂的事情。

无论如何,我更喜欢@ChaosPandion的重构方法...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接