C# 分配具体任务<;TImplementation>;到Task类型的变量<;TInterface>;
考虑一个类C# 分配具体任务<;TImplementation>;到Task类型的变量<;TInterface>;,c#,inheritance,interface,casting,task-parallel-library,C#,Inheritance,Interface,Casting,Task Parallel Library,考虑一个类Foo,它完全实现了IFoo。 同时,考虑一个任务任务< /> > 为什么调用以下命令时会抛出编译错误 Task<IFoo> task = Task.Factory.StartNew(() => new Foo()); Task Task=Task.Factory.StartNew(()=>newfoo()); 编译器声明它无法从源类型Task转换为Task。虽然这是有道理的,因为它们本质上是两种不同的类型,但它不属于与IList list=new list{n
Foo
,它完全实现了IFoo
。
同时,考虑一个任务<代码>任务< /> >
为什么调用以下命令时会抛出编译错误
Task<IFoo> task = Task.Factory.StartNew(() => new Foo());
Task Task=Task.Factory.StartNew(()=>newfoo());
编译器声明它无法从源类型Task
转换为Task
。虽然这是有道理的,因为它们本质上是两种不同的类型,但它不属于与IList list=new list{new Foo(/*construct*/)}相同的前提下吗代码>,或其他类似的作业
目前我正在强制对界面进行强制转换,但这感觉没有必要。您可以使用通用版本
Task<IFoo> task = Task.Run<IFoo>(() => new Foo());
Task=Task.Run(()=>newfoo());
这是因为该语句Task.Factory.StartNew(()=>newfoo())代码>返回类型为任务的实例
鉴于任务
类是一个具体的类,它不能是协变的,除非它实现了协变接口(即ITask
)
请注意,有一个uservoice主题可以完成此任务:
还请注意以下可能的解释,即为什么现在是这样:
框架准则包括:
- 如果您的框架由于其他原因已经包含了一个接口,那么一定要让它成为co+逆变
- 但是,不要仅仅为了启用co+对冲而引入接口
理由是,协方差的优势被杂波的劣势所抵消(即,每个人都必须决定是否在其代码中的每个位置使用任务
或ITask
)
目前,您必须执行以下操作:
Task<IFoo> task = Task.Factory.StartNew<IFoo>(() => new Foo());
Task Task=Task.Factory.StartNew(()=>newfoo());
你的反例不是反例。列表也不能分配给IList。嗯,你说得对。我想这也属于同一个范畴。我通常用波特兰水泥和水的混合物返回混凝土。也许你可以编辑你的标题,使其更具描述性。丹尼尔,我根据@PieterGeerkens的建议,对你的标题进行了更精确的编辑。谢谢,谢谢。我真正想要的是为什么而不是如何,这一点一针见血。@DanielPark如果你认为这充分解决了你的问题,你可以接受它作为答案,这样你的问题就可以从“未回答问题”列表中删除。