繁体   English   中英

Task.Factory.StartNew() 重载

[英]Task.Factory.StartNew() overloads

我有非常简单的代码:

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

你会得到一个不明确的调用错误,因为方法签名是一样的。 返回值不是签名的一部分。

由于您没有提供明确的返回类型,因此编译器不知道采用哪个。

C# 中的方法签名

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

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

这样做的原因是返回类型不是 C# 中重载决议的一部分(就像你不能有两个重载只是返回类型不同一样)因此编译器无法决定GetInt应该是Action还是Func<T> 通过调用StartNew<int>(GetInt)强制使用通用版本将提供所需的信息。

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

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

有助于显示异常: “以下方法或属性之间的调用不明确:‘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> ,您将强制它采用第一个签名。 否则你的代码是模棱两可的。

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

正如其他人所述,您需要将 GetInt 作为 function 传递给 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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM