通用类型 - 名称可以简化

Ome*_*r K 7 c# generics visual-studio visual-studio-2015

我正在使用Visual Studio 2015,我有两个以下的陈述.

Task<List<int>> taskWithInLineAction = new Task<List<int>>(() =>
{
    List<int> ints = new List<int>();
    for (int i = 0; i < 1000; i++)
    {
        ints.Add(i);
    }
    return ints;
});

Task<List<int>> taskWithFactoryAndState = Task.Factory.StartNew<List<int>>((stateObj) =>
{
    List<int> ints = new List<int>();
    for (int i = 0; i < (int)stateObj; i++)
    {
        ints.Add(i);
    }
    return ints;
}, 2000);
Run Code Online (Sandbox Code Playgroud)

Vs2015警告我

Task.Factory.StartNew<List<int>>((stateObj)
Run Code Online (Sandbox Code Playgroud)

可以简化为

Task.Factory.StartNew((stateObj)
Run Code Online (Sandbox Code Playgroud)

正如我所看到的,我甚至可以在没有任何类型的情况下使用它,VS从lambda表达式返回值类型推断泛型类型,如下所示:

Task taskWithFactoryAndState = Task.Factory.StartNew((stateObj) =>
{
    List<int> ints = new List<int>();
    for (int i = 0; i < (int)stateObj; i++)
    {
        ints.Add(i);
    }
    return ints;
}, 2000);
Run Code Online (Sandbox Code Playgroud)

但这不适用于第一个声明.在这种情况下,VS强迫我包含泛型类型.

你能帮助我,为什么这两个表现不一样?

在此输入图像描述

Gil*_*een 5

这两个代码示例做不同的事情。最简单的方法是在两个部分的函数中放置一个断点并按 F5。即使它低于第一部分,它也会击中第二部分的断点。

现在解释一下:

第一个只是创建一个通用对象,在调用构造函数时,您必须明确说明您正在创建的类型。

Task<List<int>> taskWithInLineAction = new Task<List<int>>(() =>
{
    List<int> ints = new List<int>();
    for (int i = 0; i < 1000; i++)
    {
        ints.Add(i);
    }
    return ints;
});
Run Code Online (Sandbox Code Playgroud)

所以写的时候new ...一定要指明是什么类型。

但是,在第二部分中,您正在执行一个函数该函数返回一个对象并将其分配给一个变量。

Task<List<int>> taskWithFactoryAndState = Task.Factory.StartNew<List<int>>((stateObj) =>
{
    List<int> ints = new List<int>();
    for (int i = 0; i < (int)stateObj; i++)
    {
        ints.Add(i);
    }
    return ints;
}, 2000);
Run Code Online (Sandbox Code Playgroud)

此时任务已经执行完毕,正在后台运行。因为您没有直接实例化对象,所以visual studio 告诉您可以推断返回类型,因此“名称可以简化”。

如果你看visual studio也说你可以await,而它没有对第一部分说:

List<int> taskWithFactoryAndState = await Task.Factory.StartNew<List<int>>((stateObj) =>
{
    List<int> ints = new List<int>();
    for (int i = 0; i < (int)stateObj; i++)
    {
        ints.Add(i);
    }
    return ints;
}, 2000);
Run Code Online (Sandbox Code Playgroud)