nullable type and a ReSharper warning

≯℡__Kan透↙ 提交于 2019-12-10 04:13:18

问题


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() { ... }

I get a ReSharper warning on the return statement about a possible System.InvalidOperationException and it suggests I check _logLevel to see if it is null first. However, readLogLevelFromFile returns LogLevel, not LogLevel?, so there is no way the return statement could be reached when _logLevel is null. Is this just an oversight by ReSharper, or am I missing something?


回答1:


That looks like a bug in Resharper.

Note, however, that that isn't thread-safe.

The best way to do this is to use a static initializer, like this:

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();
}



回答2:


You could refactor it into something like this:

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

Alternatively you can use the built in lazy type (Requires .NET 4.0 or you can roll your own.):

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



回答3:


Resharper wasn't 'smart' enough to figure it out for you. It is kind of a complex thing to figure out, I would imagine.

I prefer @ChaosPandion's refactoring anyways...



来源:https://stackoverflow.com/questions/2835671/nullable-type-and-a-resharper-warning

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!