c# - 无法将日志严重性更改回 VS 2022 中的原始级别
问题描述
在一个项目中,我有一个CS8602 Dereference of a possibly null reference
警告。
出于好奇,我将严重级别从警告更改为错误。现在我无法将其改回警告或默认值。
我还尝试多次重新启动 VS 并恢复它。我该如何撤消此操作?
解决方案
所以我意识到这并不是你所问问题的答案——但它应该有助于解释正在发生的事情以及你可以做出的可能的修复:
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
);`
话虽如此,AddOptions
Azure Functions 运行时已经调用了它。调用Bind
你的方式是不必要的。您应该直接调用Configure
并传递配置部分。您可以IConfiguration
从FunctionsHostBuilderContext
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<>
了该类型——都会成功。
推荐阅读
- odoo - JSON 中第 18 位的意外令牌 <
- r - 在 cooccur-package 中运行“cooccur”函数时出现问题:未定义选定的列
- python-3.x - 需要一些提示和优化技巧
- python - 即使已定义变量未定义错误
- angular - 使用 Angular Universal 实现国际化
- c# - Unity Intellisense 与 Visual Studio Code - Intellisense 主要工作除了方法,为什么?
- python - 使用 Python 从 Google Cloud Stackdriver API 获取 JSON 格式的 Stackdriver 日志
- rust - 为什么我不能从这个函数返回泛型类型 T?
- react-native - 我们可以从 expo 代码创建 apk 文件,还是可以部署我们在 expo 中构建的 apk
- javascript - 如何每 2 个项目交替连接数组?JS