¿Hay alguna diferencia en la declaración de expresiones lambda entre .NET Framework y .NET Core?
Las siguientes expresiones se compilan en .NET Core:
var lastShift = timeline.Appointments .OfType<DriverShiftAppointment>() .SelectMany(x => x.Activities.Where(x => !x.IsTheoretical)) .OrderByDescending(x => x.Start) .FirstOrDefault();Pero no en el marco .NET.
El problema en esta expresión es la siguiente parte
.SelectMany(x => x.Activities.Where(x => !x.IsTheoretical)) donde x se declara dos veces ( SelectMany y Where ).
Este es el error en .NET Framework:
Un local o parámetro llamado 'x' no se puede declarar en este ámbito porque ese nombre se usa en un ámbito local adjunto para definir un local o parámetro
.NET Framework
Ejemplo reproducible:
public class DemoClass { public IList<int> Numbers { get; set; } = new List<int>(); } class Program { static void Main(string[] args) { var lst = new List<DemoClass> { new DemoClass { Numbers = new List<int>{ 1, 2, 3, 4, 5, 6, 7, 8 } }, new DemoClass { Numbers = new List<int>{ 1, 2, 3, 4, 5, 6, 7, 8 } }, new DemoClass { Numbers = new List<int>{ 1, 2, 3, 4, 5, 6, 7, 8 } } }; var result = lst.SelectMany(x => x.Numbers.Where(x => x % 2 == 0)) .OrderByDescending(x => x); Console.WriteLine("Hello World!"); } }Te está diciendo que el problema es esta línea:
.SelectMany(x => x.Activities.Where(x => !x.IsTheoretical))Usar la x dos veces lo confunde, es ambiguo, prueba esto:
.SelectMany(x => x.Activities.Where(y => !y.IsTheoretical))Pero tienes razón, se compila en el núcleo pero no en el marco. Parece ser así: https://github.com/dotnet/roslyn/issues/38377 . Al leer ese enlace, parece que se trata de un cambio en C# 8.0, y el núcleo apunta a 8.0 mientras que el marco apunta a 7.2.