为什么我收到警告CS8602

  • 本文关键字:警告 CS8602 c# null
  • 更新时间 :
  • 英文 :


我看到了许多关于此错误的问题,但所有/大多数问题都包含复杂的代码或类型。

多年来,我一直使用这一行来提示方法的名称,但出现了一个错误:

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

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

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

我应该更改什么/是否有其他方法可以在不出现此错误的情况下获得当前方法的名称?

感谢

GetCurrentMethod((被声明为能够返回null值。如果你确定这个值不是null,你可以使用null原谅"quot;操作员,例如

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

请参阅https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-forgiving

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

这是人们不厌其烦地报告的几个复杂场景,但根据我的经验,即使是更简单的场景,前面有非常明确的空检查,也可能导致此警告。

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

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

如果你有时能得到一个null,你可以这样做:

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

注意方法调用后的问号。

这是因为自.NET6以来,null状态分析变得更加严格。MethodBase类的Name属性(GetCurrentMethod方法返回的类型(不会返回null值,但有一个重要的警告:如果在当前方法不存在的入口点调用GetCurrentMethod,它可能会返回null值。这就是编译器警告";可能取消引用null";。

有两种方法可以解决这个问题:

1.第一种方法(我建议(是指定如果返回null值该怎么办。这可以通过条件命令来完成:

string currentMethod
if (System.Reflection.MethodBase.GetCurrentMethod().Name is not null)
{
currentMethod = System.Reflection.MethodBase.GetCurrentMethod().Name;
}else
{
currentMethod = "Unknown";
}

或者使用空合并运算符(更简洁的方式(:

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

2.第二种方法是当您确定不会返回null值,但编译器发出警告时。在这种情况下,可以使用null宽容运算符来告诉编译器属性不会返回null:

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

3.或者你可以使用pragma指令。当您在代码的一部分中使用可重复为null的值时,或者当ASP.NET Core功能与null状态分析冲突时,使用此指令可以在代码块中禁用此警告:

#pragma warning disable CS8602

然后你可以使用

#pragma warning restore CS8602

恢复的命令

类似:

#pragma warning disable CS8602
string currentMethod = System.Reflection.MethodBase.GetCurrentMethod().Name;
#pragma warning restore CS8602

问题很清楚。该名称在某个时刻可能为null。尝试使用?因此编译器将知道您知道可能来自System.Reflection.MethodBase.GetCurrentMethod((.Name;

用法:

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

文档:点击此处阅读更多信息。

相关内容

  • 没有找到相关文章

最新更新