【问题标题】:Unable to explain error message 'async is not valid for this item'无法解释错误消息“异步对此项目无效”
【发布时间】:2017-10-19 04:12:30
【问题描述】:

我正在学习关于如何在 .NET 核心中开发全栈项目的 PluralSight 课程,并且遇到了无数错误,SO 和一些甜蜜的 Google-fu 帮助我理解了(主要是由于 VS 版本差异)。

但是我刚刚遇到了一些更...复杂的事情?我正在使用具有此方法的界面IWorldRepository

public interface IWorldRepository
    {
        async Task<bool> SaveChangesAsync(); // <-- error occurs here 
    }

哪个接口带有这个方法的类 (WorldRepository):

public async Task<bool> SaveChangesAsync()
    {
        return (await _context.SaveChangesAsync()) > 0;
    }

根据我使用 .NET 的经验,这应该可以正常工作,但由于某种原因,界面会抱怨它,说:“修饰符 'async' 对此项目无效。” p>

我四处寻找错误并找到我们亲爱的解释 Jon Skeet。但是我并没有真正理解可能发生的事情以及为什么我的代码是错误的。

它不仅看起来不错,而且对于在 PluralSight 上运行相同代码的讲师来说似乎工作得很好。

如果有人能对此有所了解,我将不胜感激!

【问题讨论】:

  • 您不能将接口成员定义为async。删除关键字,这将编译。
  • “对于运行相同代码的讲师来说工作正常” - 这不可能。包含async Task&lt;bool&gt; SaveChangesAsync(); 的接口将无法编译
  • 我就是这么想的。那么编译器是否理解(在运行时)该方法默认是异步的(因为使用了任务)?编写这样的代码(性能和气味方面)有什么影响吗?
  • 你可能是对的,@Alex。但如果是这样的话,那么他在视频中没有提到它......
  • 这表明您对 async 的真正作用存在误解 - 它所做的是更改方法的 实现 并允许在其中使用 await 关键字它。它不是方法签名的一部分,它是一个实现细节。

标签: c# asynchronous interface task


【解决方案1】:

您不能在接口定义中使用async 关键字。但是,它被正确放置在继承类定义中。

这是因为接口定义了结构(the what),而类定义了实现(the how)。将方法标记为 async 允许在方法主体中使用 await 关键字,但不构成方法签名的一部分。

从您的界面中删除 async 关键字将允许您的代码编译。

public interface IWorldRepository
{
    Task<bool> SaveChangesAsync();
}

【讨论】:

    【解决方案2】:

    我也遇到了同样的问题,但我回去看了视频,发现红色波浪线从未离开讲师的界面声明。我想他只是没能回去修复视频中的问题。

    【讨论】:

      猜你喜欢
      • 2015-04-25
      • 2012-01-19
      • 2020-12-06
      • 1970-01-01
      • 1970-01-01
      • 2016-03-17
      • 2022-06-26
      • 1970-01-01
      相关资源
      最近更新 更多