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】:

更换

&lt;NullableReferenceTypes&gt;true&lt;/NullableReferenceTypes&gt;

&lt;NullableContextOptions&gt;enable&lt;/NullableContextOptions&gt;

修复了可空引用类型的问题。

编辑:

可能值得在 .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”上下文中的代码中

解决方案

更改&lt;NullableReferenceTypes&gt;true&lt;/NullableReferenceTypes&gt;

&lt;NullableContextOptions&gt;enable&lt;/NullableContextOptions&gt;

说明

这是从 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)中损坏

如何使用 C#8 IAsyncEnumerable<T> 来异步枚举并行运行的任务

转换 IQueryable 以实现 IAsyncEnumerable [重复]