¿C # 6.0 funciona para .NET 4.0?

275

Creé un proyecto de muestra, con extras de C # 6.0: propagación nula e inicialización de propiedades como ejemplo, establecí la versión de destino .NET 4.0 y ... funciona.

public class Cat
{
    public int TailLength { get; set; } = 4;

    public Cat Friend { get; set; }

    public string Mew() { return "Mew!"; }
}

class Program
{
    static void Main(string[] args)
    {
        var cat = new Cat {Friend = new Cat()};
        Console.WriteLine(cat?.Friend.Mew());
        Console.WriteLine(cat?.Friend?.Friend?.Mew() ?? "Null");
        Console.WriteLine(cat?.Friend?.Friend?.TailLength ?? 0);
    }
}

¿Significa que puedo usar las funciones de C # 6.0 para mi software que apunta a .NET 4.0? ¿Hay alguna limitación o inconveniente?

MajesticRa
fuente
77
Las versiones .Net 2.0 - 3.5 usan CLR v2.0. Las versiones más nuevas usan CLR v4.0.
i3arnon
tenga en cuenta que, optimice sabiamente: está agregando un cheque if-null-check separado para cada gato como este
Terence
2
Dios mío. He estado desarrollando un WCF dirigido a v4.6 solo para "recordarme" que el servidor de producción no se actualizará hasta 2018. Pensé que el trabajo de un mes requeriría unos días de refactorización. Terminado en cinco minutos. ¡Gracias, Microsoft! : D
Eric Wu

Respuestas:

286

Sí (mayormente) C # 6.0 requiere el nuevo compilador de Roslyn, pero el nuevo compilador puede compilar para versiones de framework anteriores. Eso solo se limita a las nuevas características que no requieren soporte del marco .

Por ejemplo, si bien puede usar la función de interpolación de cadenas en C # 6.0 con versiones anteriores de .Net (ya que genera una llamada a string.Format):

int i = 3;
string s = $"{i}";

Necesita .Net 4.6 para usarlo, IFormattableya que solo la nueva versión de marco agrega System.FormattableString:

int i = 3;
IFormattable s = $"{i}";

Los casos que mencionó no necesitan tipos del marco para funcionar. Por lo tanto, el compilador es totalmente capaz de soportar estas características para versiones antiguas de framework.

i3arnon
fuente
31
En realidad, no necesita .Net 4.6, solo algunos tipos que se agregan en él. Puede agregarlos a marcos más antiguos usted mismo. Este código funciona bien en .Net 4.0 y 3.5.
svick
10
¿Hay una lista en alguna parte para ver qué características de C # 6 funcionan en .NET 4.0? Otra forma de preguntar esto sería: ¿qué nuevas características requieren soporte del marco y cuáles no?
Rubenisme
1
@Rubenisme No puedo pensar en otro que no sea la IFormattableinterpolación de cadenas.
i3arnon
2
Supongo que podemos decir que todos los azúcares sintácticos pueden usarse y dirigirse a versiones de framework anteriores. ¿está bien decir eso?
mkb
44
@mkb sí. El azúcar sintáctico es exactamente esas características que solo dependen de las capacidades del compilador y no de las del marco.
i3arnon
52

Solo quiero centrarme en cómo entender Wikipedia y otros enlaces.

Cuando Wikipedia dice que C # 6.0 es con .NET Framework 4.6, simplemente significa que la versión de producción del compilador (msc.exe) formará parte de la versión .NET Framework 4.6. A través de la orientación múltiple , estos compiladores pueden admitir versiones inferiores de las versiones de .NET Framework. Por supuesto, desde que Roslyn se convirtió en un proyecto de código abierto, el compilador ahora es completamente un componente individual.

Cuando algo se refiere a la versión CLR de 4.0.30319 (.0), en realidad puede ser .NET Framework 4. * (4.0, 4.0. *, 4.5, 4.5. *, 4.6, 4.6. *), Ya que todos implementan el CLR versión 4 especificación. Sin mencionar que Xamarin / Mono también implementan la misma especificación CLR.

La página de MSDN aún no está completamente actualizada, pero algunas páginas ya tienen .NET Framework 4.6 en la sección Información de la versión.

En total, las especificaciones de lenguaje (así como el compilador de C #), las especificaciones de CLR y las versiones de .NET Framework no están estrechamente relacionadas entre sí. Brinda a los desarrolladores suficiente flexibilidad para utilizar nuevos compiladores para apuntar a CLR y marcos de trabajo .NET más antiguos.

Lex Li
fuente
29

Sí, puede usar compiladores más nuevos para marcos más antiguos y obtener acceso a las nuevas funciones del compilador (siempre que esas funciones no requieran nuevos tipos introducidos en .NET 4.6).

Otros ejemplos de esto son los métodos con parámetros predeterminados que se introdujeron con C # 4.0 (.NET 4.0) pero puede usarlos en proyectos .NET 2.0 (C # 2.0) y .NET 3.5 (C # 3.0).

También puede usar los métodos de extensión (introducidos en C # 3.0) en .NET 2.0 o .NET 3.0 si hace una pequeña solución para hacer feliz al compilador para que pueda encontrar un atributo que se introdujo en .NET 3.5.

Scott Chamberlain
fuente
1

Si está utilizando scripts de construcción, recuerde cambiar la ruta al nuevo generador:

establecer CPATH = C: \ Archivos de programa (x86) \ MSBuild \ 14.0 \ Bin

[Reconstruir.bat]

set CPATH=C:\Program Files (x86)\MSBuild\14.0\Bin
call nuget_restore.bat
"%CPATH%\msbuild" YourSolution.sln /t:Rebuild /p:Configuration=Release /fileLogger /flp:logfile=JustErrors.log;errorsonly /verbosity:minimal

if %errorlevel% neq 0 goto ERROR

REM call deploy Release  //Things like deploy files..
goto END

:ERROR
       echo ERROR: %errorlevel%
       pause

:END
oobe
fuente
1

La respuesta de @oobe es realmente importante. Podría construir mi solución a través de un archivo por lotes solo después de usar MSBuild.exe desde C: \ Archivos de programa (x86) \ MSBuild \ 14.0 \ Bin .

Suryakant Soni
fuente