Projeção usando delegado assíncrono / lambda
O seguinte código não irá compilar contra o CTP Async no Visual Studio 2010:
Enumerable.Range(1, 5).Select(async x =>
{
await TaskEx.Delay(100);
return 5;
});
O erro de compilação é o seguinte:
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>'
No entanto, pela minha leitura, o seguinte deve ocorrer aqui:
A sobrecargaIEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)
deve ser usado.Enquanto o.Range(1, 5)
éIEnumerable<int>
, TSource
éint
Fazendo o lambda assíncrono, tomando umint
e retornando umint
deve produzir umTask<int>
que é o queTResult
deveria estar.Eu não vejo um problema de sintaxe aqui. Qual é o problema?
Observe que não posso usar o VS11 ainda porque meu aplicativo principal requer ferramentas do Azure.
EDITAR: Isso funciona bem commsbuild
na linha de comando, mas não no VS2010. Parece que na linha de comando, o compilador VS11 está sendo usado mesmo que eu esteja direcionando o .NET 4.0, enquanto o VS2010 usa seu próprio compilador em processo. Alguém sabe como trocar o compilador que o VS2010 usa?