我在玩VS2019,在现有代码主体上使用了新的C#-8功能。我做了一个小项目,然后将其转换为使用新的可为空的引用类型功能。在此过程中,我遇到了这种情况:
using System;
#nullable enable
namespace NullableRefTest
{
class Demo
{
public string? Property { get; set; }
public int Test()
{
if (null == Property) // 1
throw new InvalidOperationException();
int f()
{
return Property.Length; // 2
}
return f();
}
}
}
在启用C#-8的情况下进行编译会在// // 2上产生CS8602可能取消引用空引用警告的情况。
现在,我要保持,这里显然没有null引用-f()的可见性和生存期使得无法在// 1的null引用测试之前调用它。
我假设出现警告是因为将本地函数提升到一个匿名类而实际上是如何实现的,并且在不考虑上下文的那个类中,这确实是一个空引用。
这是否只是编译器未正确运行的一种情况,还是这里有更阴险的内容表明应该保留此警告?
答案 0 :(得分:2)
当您确信变量不能为null时,可以使用!
(null-forgiving operator)覆盖编译器的行为。
int f()
{
return Property!.Length; // 2
}