【发布时间】:2016-11-03 13:04:05
【问题描述】:
鉴于以下 sn-p,我很不明白 为什么 我要实现的目标是不可能的:
界面:
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);
错误:
方法返回类型必须是安全输出的。无效方差:类型参数 T 必须在 Task 上始终有效
请帮助我理解,为什么我不能将<out T> 与Task<T> 一起使用
【问题讨论】:
-
我认为需要将操作的结果分配给任务,使其成为
<in T> -
@Jim 但结果类型是
iEnumerable<T>,而不仅仅是T....我直觉上认为这应该可行。 -
Task<T>是一个类,所以它是不变的。 -
@RenéVogt 我也这么认为。
Task本身不应该关心,什么回来了。
标签: c# async-await task covariance contravariance