Funktioniert C # 6.0 für .NET 4.0?

275

Ich habe ein Beispielprojekt mit C # 6.0-Extras erstellt - Null-Weitergabe 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 dies, 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?

MajesticRa
quelle
7
.Net-Versionen 2.0 - 3.5 verwenden CLR v2.0. Neuere Versionen verwenden CLR v4.0.
i3arnon
Denken Sie daran, optimieren Sie weise: Sie fügen einen separaten If-Null-Check für jede Katze wie diese hinzu
Terence
2
Meine Güte. Ich habe ein WCF für Version 4.6 entwickelt, um "daran erinnert" zu werden, dass der Produktionsserver erst 2018 aktualisiert werden soll. Ich dachte, ein Monat Arbeit würde ein paar Tage Refactoring erfordern. In fünf Minuten fertig. Danke, Microsoft! : D
Eric Wu

Antworten:

286

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

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 führt string.Format):

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

Sie benötigen .Net 4.6, um es zu verwenden, IFormattableda nur die neue Framework-Version Folgendes hinzufügt System.FormattableString:

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 also in der Lage, diese Funktionen für alte Framework-Versionen vollständig zu unterstützen.

i3arnon
quelle
31
Eigentlich brauchen Sie .Net 4.6 nicht, nur ein paar Typen, die hinzugefügt werden. Sie können diese selbst zu älteren Frameworks hinzufügen. Dieser Code funktioniert unter .NET 4.0 und 3.5 einwandfrei.
Svick
10
Gibt es irgendwo eine Liste, um zu sehen, welche C # 6-Funktionen in .NET 4.0 funktionieren? Eine andere Möglichkeit, dies zu erfragen, wäre: Welche neuen Funktionen erfordern Unterstützung durch das Framework und welche nicht?
Rubenisme
1
@Rubenisme Ich kann mir keinen anderen als die IFormattableString-Interpolation vorstellen .
i3arnon
2
Ich denke, wir können sagen, dass alle syntaktischen Zucker verwendet werden können und auf ältere Framework-Versionen abzielen. Ist es in Ordnung, das zu sagen?
mkb
4
@mkb ja. Syntaktischer Zucker ist genau das, was nur auf Compiler-Funktionen und nicht auf Framework-Funktionen basiert.
i3arnon
52

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

Wenn Wikipedia sagt, dass C # 6.0 mit .NET Framework 4.6 kompatibel ist, bedeutet dies einfach, 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 wurde, ist der Compiler natürlich eine vollständig einzelne Komponente.

Wenn etwas auf die CLR-Version von 4.0.30319 (.0) verweist, 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 davon, dass Xamarin / Mono dieselbe CLR-Spezifikation implementiert.

Die MSDN-Seite ist noch nicht vollständig aktualisiert, aber auf einigen Seiten ist .NET Framework 4.6 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 zu verwenden.

Lex Li
quelle
29

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

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 .NET 2.0- (C # 2.0) und .NET 3.5- (C # 3.0) Projekten 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, damit er ein Attribut finden kann, das in .NET 3.5 eingeführt wurde.

Scott Chamberlain
quelle
1

Wenn Sie Build-Attribute 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
oobe
quelle
1

Antwort von @oobe ist eigentlich wichtig. Ich konnte meine Lösung nur nach Verwendung der Datei MSBuild.exe aus C: \ Programme (x86) \ MSBuild \ 14.0 \ Bin über eine Batchdatei erstellen .

Suryakant Soni
quelle