c# .net c#-6.0

¿C#6.0 funciona para.NET 4.0?



c#-6.0 (5)

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 características de C # 6.0 para mi software que apunta a .NET 4.0? ¿Hay alguna limitación o inconveniente?


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 .


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 con IFormattable ya 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.


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.


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


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 multi-targeting , 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 general, 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.