为什么Task的Result属性不可用于非generics任务(C#4.0+)?

我试图掌握.NET 4.0+任务并行库概念……

在以下C#4.0代码段中:

Task t = Task.Factory.StartNew(() => { Console.WriteLine("I am the task"); return "res1"; }); 

为什么编译器没有(和运行时)如果不能使用返回产生任何错误,除非使用通用任务:

 Task t = Task.Factory.StartNew(() => { Console.WriteLine("I am the task"); return "res1"; }); 

或者它(返回的对象)可以使用?

我是否正确理解,只有在检测或确保返回类型(ed对象)或t.Result时才需要Task 中的Task
或者除了这个之外还有其他隐藏的必需品吗?

为什么这种类型不能从返回对象的类型中确定?
也就是为什么任务的Result属性不可用于非通用任务?

非genericsTask没有Result属性,因为它表示生成结果的进程。

您的代码在两种情况下都会创建一个Task ,但在第一种情况下,您将其强制转换为TaskTask派生自Task ,这是合法的),因此您将失去引用结果的能力。

你可以直接看到这个:

 Task t = Task.Factory.StartNew(() => { Console.WriteLine("I am the task"); return "res1"; }); var genericTask = t as Task; // genericTask will be non-null var result = genericTask.Result; // and you can access the result 

Taskinheritance自Task 。 在这两种情况下,您实际上都在创建Task ,但在第一种情况下,您隐式将其强制转换为Task ,而Task没有Result属性。