c# - 任务的协变和逆变

标签 c# async-await task covariance contravariance

鉴于以下代码片段,我完全不明白为什么我不可能实现什么:

接口(interface):

public interface IEntityRepository<out T> : IRepository<IEntity> {

    void RequeryDataBase();

    IEnumerable<T> Search(string pattern);

    Task<IEnumerable<T>> SearchAsync(string pattern);

    SearchContext Context { get; }

    string BaseTableName { get; }
  }

IRepository<IEntity>只是简单的通用 CRUD 定义。

我在这一行收到一个错误:Task<IEnumerable<T>> SearchAsync(string pattern);

错误:

method return type must be output safe. invalid variance: the type parameter T must be invariantly valid on Task

请帮助我理解,为什么我不能使用 <out T>Task<T>

最佳答案

Task<T>不是协变的。差异只能应用于通用接口(interface)(和委托(delegate),但这与此处无关)。

例如Task<IEnumerable<Dog>> 不能分配给Task<IEnumerable<Animal>> .因此,您的接口(interface)也不能标记为协变。

您可能想查看 this related question .

关于c# - 任务的协变和逆变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38139968/

相关文章:

Javascript await/async - 这会导致竞争条件吗?

javascript - 引用错误 : exports is not defined in ES module scope

mysql - 选择用于创建任务管理 Web 应用程序的语言

c# - 返回使用另一个异步函数的异步任务

c# - 使用 asp-ajax 按顺序加载项目并提高 Web 应用程序速度

c# - 如何在 Visual C# 中制作一个简单的弹出框?

c# - 用参数模拟工厂

c# - 使用 "one-to-many"关系和 WebApi 时,Entity Framework Core 异步/等待死锁

c# - 从异步编程模型 (APM) 转向基于任务的异步模式 (TAP)

c# - 添加更多选项卡时如何缩小 tabItem 大小(例如 google chrome 选项卡)