8

我有非常简单的代码:

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);:),但我想知道上面的代码有什么问题。

4

6 回答 6

3

由于方法签名相同,您会收到一个模棱两可的调用错误。返回值不是签名的一部分。

由于您没有提供显式返回类型,编译器不知道该采用哪个。

C# 中的方法签名

于 2012-04-05T19:01:25.817 回答
3

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

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

原因是返回类型不是 C# 中重载解决方案的一部分(与您不能有两个仅在返回类型不同的重载一样),因此编译器无法决定GetInt应该是 anAction还是 a Func<T>。通过调用强制使用通用版本StartNew<int>(GetInt)将提供所需的信息。

于 2012-04-05T19:13:11.303 回答
2

作为记录,这里有另外两种方法(编译):

var task3 = Task.Factory.StartNew((Func<int>)GetInt);
var task4 = Task.Factory.StartNew(() => GetInt());
于 2012-04-05T19:11:22.700 回答
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>或提供 aFunc<int>您会强制它采用第一个签名。没有那个你的代码是模棱两可的。

于 2012-04-05T19:06:23.287 回答
0

您会收到编译错误,因为 StartNew 方法接受了具有各种重载的 Action(返回 void)或 Func(返回某些东西)谓词,而不是直接委托。

于 2012-04-05T18:58:50.453 回答
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;
}
于 2012-04-05T19:08:35.177 回答