可空类型和ReSharper警告

我有以下代码:

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? ,所以当_logLevelnull时,无法达到return语句。 这只是ReSharper的疏忽,还是我错过了什么?

这看起来像Resharper中的一个错误。

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

执行此操作的最佳方法是使用静态初始化程序 ,如下所示:

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

你可以将它重构成这样的东西:

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

或者,您可以使用内置的延迟类型(需要.NET 4.0或者您可以自己滚动。):

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

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

无论如何我更喜欢@ ChaosPandion的重构……