Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 分配具体任务<;TImplementation>;到Task类型的变量<;TInterface>;_C#_Inheritance_Interface_Casting_Task Parallel Library - Fatal编程技术网

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如果你认为这充分解决了你的问题,你可以接受它作为答案,这样你的问题就可以从“未回答问题”列表中删除。