我正在使用 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 的情况下编译它会生成 CS8602 可能对//2 上的空引用警告进行取消引用。
现在,我认为,这里显然不可能存在空引用 - f() 的可见性和生命周期使得它不可能在//1 处的空引用测试之前被调用。
我假设警告的出现是因为本地函数实际上是通过将它们提升到匿名类来实现的,并且在该类中被认为是脱离上下文的,这确实是一个可能的空引用。
这只是编译器尚未正确的情况,还是这里有更阴险的东西表明应该保留此警告?
最佳答案
当您确信变量不能为 null 时,可以使用 !
( null-forgiving operator ) 覆盖编译器行为。
int f()
{
return Property!.Length; // 2
}
关于c# - 可空引用类型和本地函数 - 它们可以很好地协同工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55522548/