【问题标题】:Why do I get warning CS8602?为什么我会收到警告 CS8602?
【发布时间】:2022-04-04 21:28:27
【问题描述】:

我看到很多关于这个错误的问题,但所有/大部分都包含复杂的代码或类型。

这行用了很多年,提示错误的方法名:

string currentMethod = System.Reflection.MethodBase.GetCurrentMethod().Name;

但现在我得到了这个错误:

警告 CS8602:取消引用可能为空的引用。

我应该改变什么/是否有另一种方法可以获取当前方法的名称而不会出现此错误?

谢谢

【问题讨论】:

  • 你可以试试我的回答stackoverflow.com/a/69685202/6527049
  • MethodBase 方法? = System.Reflection.MethodBase.GetCurrentMethod(); if (method != null) 等。
  • 从文档中,MethodBase.GetCurrentMethod 可能返回 null。 MethodBase.Name 不应为空。那么GetCurrentMethod()!.Name ?

标签: c# null


【解决方案1】:

问题很清楚。该名称在某些时候可能为空。 尝试使用?这样编译器就会知道您知道 System.Reflection.MethodBase.GetCurrentMethod().Name 可能存在 null;

用法:

string? currentMethod = System.Reflection.MethodBase.GetCurrentMethod().Name;

文档:read more here.

【讨论】:

  • 我知道使用?但同样的消息也会出现:(
  • 只要它只是一个警告并且您正在控制您的代码,那么您就不必太担心它。最终的解决方案可能是停用警告或将其包装在 try/catch 块中。但正如我所说,如果你控制你的代码并且你确定你不会得到一个空值,那么就照原样去做吧。
【解决方案2】:

虽然您可能确实有一个未处理的空变量或属性,但可以看出 CS8602 容易出现误报。 https://github.com/dotnet/roslyn/issues/44805 和https://github.com/dotnet/roslyn/issues/49653

这些是人们费心报告的几个复杂场景,但根据我的经验,即使是更简单的场景,如果前面有非常明确的空值检查,仍然会导致此警告。

因为消除此警告的努力可能会导致您将不可为空的字段设置为可空,只是为了使警告消失,因此 CS8602 的解决方案通常比问题更糟糕。

答案:降级警告,直到他们修复误报。

【讨论】:

    【解决方案3】:

    GetCurrentMethod() 被声明为能够返回空值。 如果您确定该值不为 null,则可以使用 null-forgiving “!”运算符例如

    string currentMethod = System.Reflection.MethodBase.GetCurrentMethod()!.Name;
    

    见https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-forgiving

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 2012-08-10
      • 2019-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多