Utilizando características de C# 3.0 en proyectos para .NET 2.0 ó 3.0
Una de las características más útiles que ofrece Visual Studio 2008, conocida en inglés como multi-targeting, es la posibilidad de desarrollar aplicaciones que luego puedan ser desplegadas sobre .NET Framework 2.0, .NET Framework 3.0 ó .NET Framework 3.5. En relación con esto, surge una pregunta interesante: ¿puedo utilizar las nuevas características del lenguaje C# 3.0 en proyectos que vayan a ser desplegados sobre .NET 2.0 o .NET 3.0?
La respuesta es *SI*, en el caso de las características del lenguaje que no dependan de librerías específicas de .NET 3.5. Se pueden utilizar sin problemas la inferencia de tipo de variables locales, las variables implementadas automáticamente, los métodos extensores, los métodos parciales y las expresiones lambda. Dos características, los árboles de expresiones y las consultas integradas (LINQ) *NO* se pueden utilizar, al menos inmediatamente, porque dependen de clases pertenecientes al ensamblado System.Core.dll, que es nuevo en la versión 3.5.
Con respecto a LINQ, sabemos que la sintaxis de consultas integradas se traduce en una cascada de llamadas a los operadores Where(), OrderBy(), etc., y es de la ausencia de éstos de lo que se queja el compilador. Si ponemos nosotros el proveedor de LINQ, las consultas compilarán y ejecutarán correctamente (al menos en el caso de las consultas contra fuentes en memoria; aquí influye también el hecho de que IEnumerable<T> ya existía en .NET 2.0).
Por ejemplo, cree en VS2008 una aplicación de consola para .NET 2.0 y agregue al proyecto nuestro proveedor "desde cero" ClaseLinq<T> (en DEMO3 del post anterior). Dentro del espacio de nombres en el que esa clase está programada, añada las siguientes definiciones de delegados, utilizados por el proveedor, que formalmente también aparecieron en la versión 3.5:
public delegate TResult Func<TResult>(); public delegate TResult Func<T, TResult>(T arg); public delegate TResult Func<T1, T2, TResult>(T1 arg1, T2 arg2);
Por último, asigne el siguiente código al método
Program.Main():
var lista = new ClaseLinq<int> { 1, 2, 3, 4, 5, 6 };
// los cuadrados de los pares var q = from n in lista
where n % 2 == 0 select n * n;
foreach (var n in q) Console.WriteLine(n);
Console.ReadLine();
El programa compilará perfectamente y se ejecutará correctamente al ser desplegado sobre un equipo con .NET 2.0.