我的代码非常简单:
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);
)但我想知道上面代码的问题是什么。
答案 0 :(得分:3)
答案 1 :(得分:3)
因为编译器无法决定使用这两个重载中的哪一个:
StartNew(Action)
StartNew<TResult>(Func<TResult>)
原因是返回类型不是C#中重载决策的一部分(同样的方式,你不能有两个只在返回类型上不同的重载),因此编译器无法决定是否GetInt
应该是Action
或Func<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;
}