Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

nullable type and a ReSharper warning

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?

like image 587
Sarah Vessels Avatar asked May 14 '10 16:05

Sarah Vessels


2 Answers

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();
}
like image 92
SLaks Avatar answered Oct 28 '22 20:10

SLaks


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);
like image 28
ChaosPandion Avatar answered Oct 28 '22 21:10

ChaosPandion