Task.Factory.StartNew()重载

时间:2012-04-05 18:54:41

标签: c# compiler-errors task

我的代码非常简单:

static void Main(string[] args)
{
    var task = Task.Factory.StartNew(GetInt);

    var task2 = Task.Factory.StartNew(
        () =>
        {
            return GetInt();
        });
}

static int GetInt()
{
    return 64;
}

为什么第一个任务会出现编译器错误? 方法签名(没有参数,返回类型是int)是相等的,不是吗?

我知道一个解决方案(这很简单:var task = Task.Factory.StartNew<int>(GetInt);)但我想知道上面代码的问题是什么。

6 个答案:

答案 0 :(得分:3)

由于方法签名相同,因此会出现模糊的调用错误。 返回值不是签名的一部分。

由于您未提供显式返回类型,因此编译器不知道要采用哪种类型。

Method Signature in C#

答案 1 :(得分:3)

因为编译器无法决定使用这两个重载中的哪一个:

StartNew(Action)
StartNew<TResult>(Func<TResult>)

原因是返回类型不是C#中重载决策的一部分(同样的方式,你不能有两个只在返回类型上不同的重载),因此编译器无法决定是否GetInt应该是ActionFunc<T>。通过调用StartNew<int>(GetInt)强制使用通用版本将提供所需信息。

答案 2 :(得分:2)

对于记录,这里有两种方法(编译):

var task3 = Task.Factory.StartNew((Func<int>)GetInt);
var task4 = Task.Factory.StartNew(() => GetInt());

答案 3 :(得分:1)

有助于显示异常:“以下方法或属性之间的调用不明确:'System.Threading.Tasks.TaskFactory.StartNew(System.Action)'和'System.Threading.Tasks.TaskFactory .StartNew(System.Func)'“

如果你看看有两种可能的方法:

public Task<TResult> StartNew<TResult>(Func<TResult> function);
public Task StartNew(Action action);

如果您添加<int>或提供Func<int>,则强制它进行第一次签名。没有它,你的代码就不明确了。

答案 4 :(得分:0)

你得到编译错误,因为StartNew方法接受一个Action(返回void)或一个Func(返回某些东西)谓词及其各种重载,而不是直接委托。

答案 5 :(得分:0)

正如其他人所说,您需要将GetInt作为函数传递给StartNew,或者指定您打算通过提供泛型类型从StartNew返回值。否则,编译器不知道你打算创建什么样的任务....它是不明确的。

static void Main(string[] args)
{
    var task = Task.Factory.StartNew<int>(GetInt);

    var task2 = Task.Factory.StartNew(
        () =>
        {
            return GetInt();
        });
}

static int GetInt()
{
    return 64;
}