IAsyncEnumerable<> 在 VS 2019 预览版 2(Core 3.0 预览版 1)中损坏
Posted
技术标签:
【中文标题】IAsyncEnumerable<> 在 VS 2019 预览版 2(Core 3.0 预览版 1)中损坏【英文标题】:IAsyncEnumerable<> broken in VS 2019 preview 2 (Core 3.0 preview 1) 【发布时间】:2019-06-19 05:44:07 【问题描述】:安装 VS 2019 预览版 2 后,出现大量错误。错误演示代码:
public class Class1
public static async IAsyncEnumerable<int> Get()
for( int i = 0; i < 10; i++ )
await Task.Delay( 100 );
yield return i;
仅此而已(一个新的 dll 项目)! 预览 1 没问题。
项目:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<LangVersion>8.0</LangVersion>
</PropertyGroup>
</Project>
错误信息是: 错误 CS0656 缺少编译器所需的成员 'System.Collections.Generic.IAsyncEnumerable`1.GetAsyncEnumerator'
对象浏览器显示 Collections.Generic 中的成员。
有什么想法吗?等待 Core 3.0 预览版 2?
类似IAsyncEnumerable not working in C# 8.0 preview 的东西?
VS 2019 P2 的另一个问题(另一个项目): 尽管 NullableReferenceTypes 行存在 Nullabilty 警告(在 vs 19 中,预览 1 还可以):
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<LangVersion>8.0</LangVersion>
**<NullableReferenceTypes>true</NullableReferenceTypes>**
警告:警告 CS8632 可空引用类型的注释只能在“#nullable”上下文中的代码中使用。 项目设置不够?不再是全球性的了?
【问题讨论】:
是的,这暂时被破坏了,它将被修复。请参阅 Mads' blog 中的“自预览版 1 以来的更改”,其中提到了这两个问题。 现在,谁投票结束了这个问题?它当然是可复制的并得到官方认可 这绝对是“类似这种情况”,但这次你不能只添加缺少的类。IAsyncEnumerable
存在,但方法不同。你不能用扩展方法来伪造它,任何注入缺失方法的技术都是不值得的。您将不得不使用每日构建或等待 Core 3.0 Preview 2。OTOH,鉴于这些预览的波动性,不妨使用每日构建
【参考方案1】:
更换
<NullableReferenceTypes>true</NullableReferenceTypes>
有
<NullableContextOptions>enable</NullableContextOptions>
修复了可空引用类型的问题。
编辑:
可能值得在 .csproj 文件中同时使用这两个选项,因为 dotnet Docker 映像尚未更新,并且将失败,因为它无法识别新的可空引用类型标记
【讨论】:
【参考方案2】:问题 1
缺少编译器所需的成员 'System.Collections.Generic.IAsyncEnumerable`1.GetAsyncEnumerator'
解决方案
安装 .NET Core v3.0.100-preview-010177
https://github.com/dotnet/core-sdk#installers-and-binaries
说明
IAsyncEnumerable
从 .NET Core 3 预览版 1 到 .NET Core 预览版 2 发生了重大变化
异步流
我们改变了编译器期望的 IAsyncEnumerable 接口的形状!这会使编译器与 .NET Core 3.0 Preview 1 中提供的接口不同步,这可能会给您带来一些麻烦。但是,.NET Core 3.0 Preview 2 即将发布,这将使接口重新同步。
来源:https://blogs.msdn.microsoft.com/dotnet/2019/01/24/do-more-with-patterns-in-c-8-0/
问题 2
可空引用类型的注解只能用在“#nullable”上下文中的代码中
解决方案
更改<NullableReferenceTypes>true</NullableReferenceTypes>
到
<NullableContextOptions>enable</NullableContextOptions>
说明
这是从 VS2019 Preview 1 到 VS2019 Preview 2 的重大变化。
可为空的引用类型
我们添加了更多选项来控制源代码(通过 #nullable 和 #pragma 警告指令)和项目级别的可空警告。我们还更改了项目文件选择加入以启用。
来源:https://blogs.msdn.microsoft.com/dotnet/2019/01/24/do-more-with-patterns-in-c-8-0/
【讨论】:
1000 谢谢! (i) 你的回答逻辑清晰,结构完美; (ii) 没错——你救了我。 谢谢@me-on-stov!不要忘记将其标记为“已回答”,以帮助开发人员在未来解决同样的问题? .NET Core 3.0 预览版 2.0 just came out @BrandonMinnick 这在预览版 4 中是否被重新破解,因为我今天从预览版 3 升级到 4 后遇到了这个问题? 嗨@PaulManzotti!由于@me-on-stov 的原始问题集中在 Preview 2,请继续为 Preview 4 打开一个新问题并分享下面的链接 ?【参考方案3】:在 Visual Studio 16.2 中,属性名称更改为 Nullable
,这样更简单,并且与命令行参数一致。
<PropertyGroup>
<LangVersion>8.0</LangVersion>
<Nullable>enable</Nullable>
</PropertyGroup>
【讨论】:
以上是关于IAsyncEnumerable<> 在 VS 2019 预览版 2(Core 3.0 预览版 1)中损坏的主要内容,如果未能解决你的问题,请参考以下文章
为啥使用 IAsyncEnumerable 比返回 async/await Task<T> 慢?
.net 核心 3.1:“IAsyncEnumerable<string>”不包含“GetAwaiter”的定义
是否可以将 IObservable<T> 转换为 IAsyncEnumerable<T>
IAsyncEnumerable<> 在 VS 2019 预览版 2(Core 3.0 预览版 1)中损坏