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强迫我包含泛型类型.
你能帮助我,为什么这两个表现不一样?
这两个代码示例做不同的事情。最简单的方法是在两个部分的函数中放置一个断点并按 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)
| 归档时间: |
|
| 查看次数: |
1199 次 |
| 最近记录: |