12

我正在尝试掌握 .NET 4.0+ 任务并行库的概念...

在以下 C# 4.0 代码片段中:

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

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

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

还是可以使用它(返回的对象)?

我是否正确理解<string>inTask<string>仅用于检测或确保返回(ed 对象)或的类型t.Result
或者除了这个之外,还有什么对我隐藏的必需品?

为什么无法从返回对象的类型中确定该类型?
即为什么非通用任务的任务的结果属性不可用?

4

2 回答 2

21

非泛型Task没有Result属性,因为它表示产生结果的过程。

您的代码在这两种情况下都创建了 a Task<string>,但在第一种情况下,您将其转换为 a Task(Task<string>派生自Task,因此这是合法的),因此您无法引用结果。

你可以直接看到这个:

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

var genericTask = t as Task<string>; // genericTask will be non-null
var result = genericTask.Result;     // and you can access the result
于 2013-03-12T11:08:46.460 回答
0

Task<T>继承自Task。在这两种情况下,您实际上是在创建 a Task<T>,但在第一种情况下,您将其隐式转换为Task,它不具有该Result属性。

于 2013-03-12T11:11:34.327 回答