.NET Standard 2.0实现ILogger遇notnull约束错误,如何解决?
解决.NET Standard 2.0项目中ILogger BeginScope的CS8370编译错误
你遇到的问题根源在于:虽然Microsoft.Extensions.Logging包标注支持.NET Standard 2.0,但较新版本的包中,ILogger.BeginScope<TState>接口定义使用了C# 8.0引入的notnull泛型约束;而.NET Standard 2.0项目默认使用C# 7.3,不支持该特性,导致自动生成的实现代码编译报错。
不需要强制升级到.NET 8+,有两种可行方案:
方案一:在.NET Standard 2.0项目中启用C# 8.0支持
.NET Standard 2.0完全兼容C# 8.0的大部分特性(包括notnull约束和nullable上下文),只需修改项目配置开启即可:
- 右键项目 → 选择“编辑项目文件”(.csproj)
- 在
<PropertyGroup>节点中添加以下配置:
<LangVersion>8.0</LangVersion> <Nullable>enable</Nullable>
修改后的项目文件示例:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> <LangVersion>8.0</LangVersion> <Nullable>enable</Nullable> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.Extensions.Logging" Version="6.0.0" /> </ItemGroup> </Project>
保存后重新编译,notnull约束的代码就能正常通过编译。
方案二:手动修改BeginScope实现,移除notnull约束
如果不想调整C#版本,也可以手动修改自动生成的代码,去掉notnull约束并处理null状态:
自动生成的错误代码通常是这样的:
public IDisposable? BeginScope<TState>(TState state) where TState : notnull { throw new NotImplementedException(); }
修改为:
public IDisposable? BeginScope<TState>(TState state) { // 先处理state为null的情况,避免后续逻辑出错 if (state == null) { return null; } // 这里编写你的日志Scope实现逻辑 return new EmptyScope(); // 示例:返回空的Disposable实现 } // 可选:定义一个空的Disposable类作为默认返回 private class EmptyScope : IDisposable { public void Dispose() { } }
这种方式绕开了C#版本限制,也能满足接口实现要求。
内容的提问来源于stack exchange,提问作者Greg Burghardt
相关产品推荐
相关产品推荐

