Funciona C # 6.0 for.NET ¿4.0?


He creado un proyecto de ejemplo, con C#6.0 goodies - null propagación e inicialización de propiedades como ejemplo, establecer la versión de destino.NET 4.0 y él... obrar.

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 funciones de C# 6.0 para mi software que se dirige a. NET 4.0? ¿Existen limitaciones o inconvenientes?

 252
Author: Community, 2015-03-08

5 answers

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

Por ejemplo, mientras que puede usar la función de interpolación de cadenas en C # 6.0 con versiones anteriores de. Net (ya que resulta en 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 del framework agrega System.FormattableString:

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

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

 270
Author: i3arnon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-08 07:41:19

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 la versión de producción del compilador (msc.exe) formará parte de la versión 4.6 de.NET Framework. A través de multi-targeting, estos compiladores pueden soportar 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 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 la especificación CLR versión 4. Sin mencionar que Xamarin / Mono también implementa la misma especificación CLR.

La página de MSDN aún no está completamente actualizada, pero alguna página ya tiene.NET Framework 4.6 listado en la sección Información de 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 son estrictas junto con los demás. Da a los desarrolladores suficiente flexibilidad para utilizar nuevos compiladores para dirigirse a CLRs y. NET Frameworks más antiguos.

 49
Author: Lex Li,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-19 10:29:15

Sí, puede usar compiladores más nuevos para frameworks más antiguos y obtener acceso a las nuevas características del compilador (siempre y cuando esas características 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 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.

 27
Author: Scott Chamberlain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:51

Si está utilizando ascripts de construcción recuerde cambiar la ruta a nuevo constructor:

Set CPATH=C: \ Program Files (x86)\MSBuild\14.0\Bin

[Reconstruir.mtd]

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
 0
Author: oobe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-03 13:45:31

La respuesta de @oobe es realmente importante. Pude construir mi solución a través de un archivo por lotes solo después de usar el MSBuild.exe de C:\Program Files (x86)\MSBuild\14.0 \ Bin.

 0
Author: Suryakant Soni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-19 08:25:54