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.

 

Published 28/2/2008 17:40 por Octavio Hernández
Archivado en:
Comparte este post:

Comentarios

Thursday, February 28, 2008 8:41 PM por Rafael Ontivero

# re: Utilizando características de C# 3.0 en proyectos para .NET 2.0 ó 3.0

Pocas entradas, pero de calidad.

:-)

Thursday, February 28, 2008 10:14 PM por Octavio Hernández

# re: Utilizando características de C# 3.0 en proyectos para .NET 2.0 ó 3.0

Eso es más bien aplicable a usted, señor... :-)

Friday, February 29, 2008 4:38 AM por Ramón Sola

# re: Utilizando características de C# 3.0 en proyectos para .NET 2.0 ó 3.0

El sitio web del libro C# 3.0 in a Nutshell ofrece otra implementación de los operadores de 'LINQ to Objects', independiente de .NET 3.5, que se llama LINQBridge. Puede ser interesante echarle un vistazo, ya que se incluye el código fuente: www.albahari.com/.../linqbridge.html

Friday, February 29, 2008 10:34 AM por Octavio Hernández

# re: Utilizando características de C# 3.0 en proyectos para .NET 2.0 ó 3.0

Gracias, Ramón!

Otra implementación existente es LINQSQO, que está en CodePlex:

www.codeplex.com/LINQSQO

Creo que ésta es más o menos "coetánea" con la mía (y anterior a la de los hermanos Albahari - je, je, esto suena como "los hermanos Coen"), y nunca la miré para evitar "parecidos sospechosos".

Saludos - Octavio