在不影响 C# 8 可空分析器的情况下测试 null

Testing for null without affecting C# 8 nullable analyzer

启用 C# 8 可为空后,以下代码不会生成错误。

var x = GetObjectX();
return x;

通过添加一行,我收到警告:

var x = GetObjectX();
Debug.Assert(x != null);
return x; //Warning: 'X' may be null here. Possible null reference return.

这是预期的行为吗?

我不信任没有调试行的可空算法的原因是因为返回的对象被反序列化。

抑制警告的最干净的方法是什么?

尝试 null forgiving operator ! 当您比编译器更清楚可空变量在运行时不会为空时,可以使用它。

var x = GetObjectX();
Debug.Assert(x != null);
return x!;

在.NET Core 3中,Debug.Assert被注释为[DoesNotReturnWhen(false)],这有助于编译理解代码并避免警告。

如果没有它,编译器会将 null 测试视为用户指示该值毕竟可能为 null。

如果您不使用 .NET Core 3,您可以创建自己的断言方法。请参阅 RoslynDebug.Assert 作为示例。