.NET Standard 2.0中await using无法使用的问题排查
解决netstandard2.0下await using Stream触发CS8417错误的问题
问题根源
- netstandard2.0的
Stream类并未原生实现IAsyncDisposable接口,这个接口是在netstandard2.1及后续版本才内置到系统类库中的。 - 你引入的
Microsoft.Bcl.AsyncInterfaces仅提供了IAsyncDisposable接口的定义,无法修改系统自带Stream的实现,所以在netstandard2.0的编译环境下,Stream依然不支持异步using语句,这就是CS8417错误的原因。 - 移除netstandard2.0目标框架后,编译环境切换到更高版本框架(如netstandard2.1、netcoreapp3.1+),这些框架的
Stream已经原生实现了IAsyncDisposable,因此报错消失。
可行解决办法
- 条件编译适配多框架:通过预编译指令区分netstandard2.0和其他框架的代码逻辑,在低版本框架下使用普通using:
#if NETSTANDARD2_0 using var stream = await response.Content.ReadAsStreamAsync(); #else await using var stream = await response.Content.ReadAsStreamAsync(); #endif - 替换读取方式(小数据场景):如果请求返回的数据量不大,可以先读取为字节数组再转为内存流,避免直接操作原始Stream:
var bytes = await response.Content.ReadAsByteArrayAsync(); using var stream = new MemoryStream(bytes); - 移除netstandard2.0目标框架:如果业务场景不需要兼容netstandard2.0,直接移除该目标框架,统一使用支持
IAsyncDisposable的高版本框架。
内容的提问来源于stack exchange,提问作者JuChom
相关产品推荐
相关产品推荐

