You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求助:.NET Standard中实现自定义异步返回类型遇阻

解决.NET Standard 2.0中自定义Task-Like类型的AsyncMethodBuilderAttribute问题

兄弟,我太懂你踩的这个坑了!你遇到的问题核心原因其实很明确:.NET Standard 2.0本身并不原生支持AsyncMethodBuilderAttribute,而且你自己手动实现的同名属性,编译器根本不认

为啥呢?因为C#编译器对Task-Like类型的支持是硬编码绑定到系统定义的System.Runtime.CompilerServices.AsyncMethodBuilderAttribute上的——它只会识别这个特定的、来自官方类库的属性,你自己写一个同名的Attribute,编译器只会把它当成普通自定义属性,不会触发Task-Like类型的特殊编译逻辑。另外,Task-Like类型是C# 7.2才引入的特性,你还得确保项目的C#语言版本达标。

下面给你两个可行的解决方案,按推荐优先级排序:

方案一:升级到.NET Standard 2.1(最推荐)

.NET Standard 2.1原生包含了AsyncMethodBuilderAttribute,和你在.NET Core里的环境完全一致。只要把项目的目标框架从.NET Standard 2.0改成2.1,你之前写的自定义Task-Like类型代码可以直接复用,不需要任何额外修改,编译器就能正常识别并支持async [MyTypeName]<T>这种返回类型。

方案二:留在.NET Standard 2.0的兼容方案

如果因为项目依赖限制必须留在2.0,那可以按以下步骤操作:

  1. 安装官方的NuGet包
    不要自己实现AsyncMethodBuilderAttribute,直接安装System.Threading.Tasks.Extensions包(版本4.5.0及以上),它在.NET Standard 2.0环境下提供了官方的AsyncMethodBuilderAttribute定义。
    用.NET CLI安装的命令:

    dotnet add package System.Threading.Tasks.Extensions --version 4.5.4
    

    或者在Visual Studio的NuGet包管理器里搜索安装。

  2. 确保C#语言版本≥7.2
    打开你的项目文件(.csproj),添加或修改以下配置,强制启用C# 7.2及以上版本:

    <PropertyGroup>
      <LangVersion>7.2</LangVersion>
    </PropertyGroup>
    

    如果你用的是Visual Studio 2017 15.5及以上版本,这个版本默认支持C#7.2;如果是更早的版本,可能需要升级IDE。

  3. 检查自定义类型的可等待模式实现
    确保你的自定义Task-Like类型正确实现了可等待模式:

    • 包含GetAwaiter()方法,返回一个实现了INotifyCompletion(或ICriticalNotifyCompletion)的Awaiter类型
    • Awaiter类型要有bool IsCompleted属性、void OnCompleted(Action)方法,以及T GetResult()方法
    • 用官方的[AsyncMethodBuilder(typeof(YourCustomMethodBuilder))]标记你的自定义类型(这个Attribute来自刚安装的NuGet包)

做完这些步骤后,编译器应该就能正确识别你的自定义Task-Like类型,不会再抛出返回类型错误了。


内容的提问来源于stack exchange,提问作者Bercovici Adrian

火山引擎 最新活动