鉴于以下代码片段,我完全不明白为什么我不可能实现什么:
接口(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/