webentwicklung-frage-antwort-db.com.de

Funktioniert C # 6.0 für .NET 4.0?

Ich habe ein Beispielprojekt mit C # 6.0-Extras erstellt - Null-Propagierung und Initialisierung der Eigenschaften als Beispiel, Zielversion .NET 4.0 festgelegt und es funktioniert.

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);
    }
}

Bedeutet das, dass ich C # 6.0-Funktionen für meine Software verwenden kann, die auf .NET 4.0 abzielt? Gibt es irgendwelche Einschränkungen oder Nachteile?

268
MajesticRa

Ja (meistens) Für C # 6.0 ist der neue Roslyn-Compiler erforderlich, der neue Compiler kann jedoch auch für ältere Framework-Versionen kompilieren. Dies ist nur auf neue Funktionen beschränkt, die keine Unterstützung durch das Framework erfordern.

Während Sie beispielsweise die Zeichenfolgeninterpolationsfunktion in C # 6.0 mit früheren Versionen von .Net verwenden können (da dies zu einem Aufruf von string.Format Führt):

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

Sie benötigen .Net 4.6, um es mit IFormattable zu verwenden, da nur die neue Framework-Version System.FormattableString Hinzufügt:

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

Die von Ihnen genannten Fälle benötigen keine Typen aus dem Framework, um zu funktionieren. Der Compiler ist daher in der Lage, diese Funktionen für alte Framework-Versionen vollständig zu unterstützen.

279
i3arnon

Ich möchte mich nur darauf konzentrieren, wie man Wikipedia und andere Links versteht.

Wenn Wikipedia angibt, dass C # 6.0 mit .NET Framework 4.6 kompatibel ist, bedeutet dies lediglich, dass die Produktionsversion des Compilers (msc.exe) Teil der .NET Framework 4.6-Version ist. Über Multi-Targeting können solche Compiler niedrigere Versionen von .NET Framework-Versionen unterstützen. Seit Roslyn ein Open-Source-Projekt ist, ist der Compiler natürlich eine vollständige Einzelkomponente.

Wenn sich etwas auf die CLR-Version 4.0.30319 (.0) bezieht, kann es sich tatsächlich um .NET Framework 4. * (4.0, 4.0. *, 4.5, 4.5. *, 4.6, 4.6. *) Handeln, da alle das implementieren CLR Version 4 Spezifikation. Ganz zu schweigen von Xamarin/Mono, das dieselbe CLR-Spezifikation implementiert.

Die MSDN-Seite ist noch nicht vollständig aktualisiert, aber einige Seite .NET Framework 4.6 ist bereits im Abschnitt Versionsinformationen aufgeführt.

Insgesamt sind Sprachspezifikationen (sowie C # -Compiler), CLR-Spezifikationen und .NET Framework-Versionen nicht eng miteinander verbunden. Es bietet Entwicklern genügend Flexibilität, um neue Compiler für ältere CLRs und .NET Frameworks einzusetzen.

51
Lex Li

Ja, Sie können neuere Compiler für ältere Frameworks verwenden und auf die neuen Compilerfunktionen zugreifen (sofern für diese Funktionen keine neuen Typen erforderlich sind, die in .NET 4.6 eingeführt wurden).

Andere Beispiele hierfür sind Methoden mit Standardparametern, die mit C # 4.0 (.NET 4.0) eingeführt wurden. Sie können sie jedoch in Projekten mit .NET 2.0 (C # 2.0) und .NET 3.5 (C # 3.0) verwenden.

Sie können auch Erweiterungsmethoden (eingeführt in C # 3.0) in .NET 2.0 oder .NET 3.0 verwenden wenn Sie eine kleine Problemumgehung durchführen , um den Compiler glücklich zu machen und ein Attribut zu finden, das eingeführt wurde in .NET 3.5.

28

Answer by @oobe ist eigentlich wichtig. Ich konnte meine Lösung nur über eine Batch-Datei erstellen, nachdem MSBuild.exe aus C:\Programme (x86)\MSBuild\14.0\Bin verwendet wurde.

1
Suryakant Soni

Wenn Sie Gebäudeaskripte verwenden, müssen Sie den Pfad zum neuen Builder ändern:

setzen Sie CPATH = C:\Programme (x86)\MSBuild\14.0\Bin

[Rebuild.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
1
oobe