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.


 

Octavio Hernandez

Desarrollador y consultor en tecnologías .NET. Microsoft C# MVP entre 2004 y 2010.

4 comentarios en “Utilizando características de C# 3.0 en proyectos para .NET 2.0 ó 3.0

  1. Gracias, Ramón!

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

    http://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

Responder a ohernandez Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *