我看到了许多关于此错误的问题,但所有/大多数问题都包含复杂的代码或类型。
多年来,我一直使用这一行来提示方法的名称,但出现了一个错误:
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;
文档:点击此处阅读更多信息。