c# - 可空引用类型和本地函数 - 它们可以很好地协同工作吗?

标签 c# c#-8.0 nullable-reference-types

我正在使用 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/

相关文章:

c# - 此开关和大小写标签中括号的目的是什么?

c# - 在使用默认方法实现接口(interface)的类上使用 `GetMethod` 返回 null

c# - 如何在运行时使用 MVVM 将 List<object> 绑定(bind)到 DataGrid

c# - 如何等待多个 IAsyncEnumerable

c# - 如何使用 DLLImport 将字符串从 C# 传递到 C++(以及从 C++ 到 C#)?

c# - 检查后 Foreach 变量不为空仍然给出警告

c#-8.0 - MaybeNull 属性对空引用返回发出警告

c# - 如何将所有 C# 8 可空引用警告视为错误?

c# - DateTime ToString (“dd/MM/yyyy” ) 返回 dd.MM.yyyy

C# 将事件处理程序添加到已在运行时从程序集中加载的类