Проекция с использованием асинхронного делегата / лямбда
Следующий код не будет компилироваться с Async CTP в Visual Studio 2010:
Enumerable.Range(1, 5).Select(async x =>
{
await TaskEx.Delay(100);
return 5;
});
Ошибка компиляции выглядит следующим образом:
Test.cs(40,13): error CS1928: 'System.Collections.Generic.IEnumerable<int>' does not contain a definition for 'Select' and the best extension method overload 'System.Linq.Enumerable.Select<TSource,TResult>(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,TResult>)' has some invalid arguments
Test.cs(40,49): error CS1503: Argument 2: cannot convert from 'lambda expression' to 'System.Func<int,int>'
Однако, по моим прочтениям, здесь должно произойти следующее:
The overloadIEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)
should be used.
As the .Range(1, 5)
is IEnumerable<int>
, TSource
is int
Making the lambda async, taking an int
and returning an int
should produce a Task<int>
, which is what TResult
should be.
I don't see a syntax issue here. What is the problem?
Обратите внимание, что я пока не могу использовать VS11, потому что для моего основного приложения требуются инструменты Azure.
EDIT: Это прекрасно работает сmsbuild
в командной строке, но не в VS2010. Кажется, что в командной строке компилятор VS11 используется, хотя я нацеливаюсь на .NET 4.0, тогда как VS2010 использует свой собственный внутрипроцессный компилятор. Кто-нибудь знает, как поменять компилятор, который использует VS2010?