首页 > 解决方案 > 无法将日志严重性更改回 VS 2022 中的原始级别

问题描述

在一个项目中,我有一个CS8602 Dereference of a possibly null reference警告。

出于好奇,我将严重级别从警告更改为错误。现在我无法将其改回警告或默认值。

我还尝试多次重新启动 VS 并恢复它。我该如何撤消此操作?

在此处输入图像描述

标签: c#.netvisual-studio-2022

解决方案


所以我意识到这并不是你所问问题的答案——但它应该有助于解释正在发生的事情以及你可以做出的可能的修复:

GetService可以返回null。编译器不知道在这种情况下取​​消引用选项对象及其Value属性是安全的*。所以因为它认为它可以null提高CS8602。

如果您想要原始行为,您可以确保此行不在您的 .editorconfig 文件中:

dotnet_diagnostic.CS8602.severity = XXX

同样,还有其他地方可以配置可为空的警告/错误。我没有在这里重新散列它们,而是向您推荐这个 QA

如果要保持启用可空注释和警告,可以使用空抑制运算符 ( !) 使此特定警告静音:

Settings settings = serviceProvider.GetService<IOptions<Settings>>()!.Value;

GetRequiredService<T>如果服务不存在,还有一个方法会抛出异常。此方法的返回值不可为空,因此不会触发任何警告:

Settings settings = serviceProvider.GetRequiredService<IOptions<Settings>>().Value;

但是——这里有点切题——你做错了。你永远不应该给BuildServiceProvider自己打电话。调用它有开销,但更重要的是,您获得的服务不一定与应用程序获得的服务相同。从技术上讲,现在可能有两个不同的单例实例,包括您的设置对象!这是一种代码异味/不良做法,以至于在 AspNetCore 中,他们添加了一个内置分析器,会为此大喊大叫。

在这种情况下,注册你的接口单例的正确方法是使用工厂版本,AddSingleton它允许你访问构建 IServiceProvider的(应用程序的其余部分将使用的那个):

builder.Services.AddSingleton<ISettings>(
   sp => sp.GetRequiredService<IOptions<Settings>>().Value
);`

话虽如此,AddOptionsAzure Functions 运行时已经调用了它。调用Bind你的方式是不必要的。您应该直接调用Configure并传递配置部分。您可以IConfigurationFunctionsHostBuilderContext

var context = builder.GetContext();
var section = context.Configuration.GetSection("YourSectionName");
builder.Services.Configure<Settings>(section);

// or if you want to bind to the root of the configuration 
builder.Services.Configure<Settings>(context.Configuration);

* 事实上,一旦你AddOptions,任何请求——IOptions<>无论是通用参数还是你是否调用Configure<>了该类型——都会成功。


推荐阅读