Neues in F# 4.7

F# 4.7 erweitert die Sprache F# mit mehreren Verbesserungen.

Erste Schritte

F# 4.7 ist in allen .NET Core-Distributionen und Visual Studio-Tools verfügbar. Weitere Informationen finden Sie unter Erste Schritte mit F#.

Sprachversion

Der F# 4.7-Compiler bietet die neue Möglichkeit, die wirksame Sprachversion über eine Eigenschaft in der Projektdatei festzulegen:

<PropertyGroup>
    <LangVersion>preview</LangVersion>
</PropertyGroup>

Sie können sie auf die Werte 4.6, 4.7, latest und preview festlegen. Der Standardwert ist latest.

Bei Festlegung auf preview aktiviert der Compiler alle F#-Vorschaufeatures, die im Compiler implementiert sind.

Implizite yield-Anweisungen

Sie müssen das yield-Schlüsselwort nicht mehr in Arrays, Listen, Sequenzen oder Berechnungsausdrücken anwenden, wenn der Typ abgeleitet werden kann. Im folgenden Beispiel mussten beide Ausdrücke vor F# 4.7 die yield-Anweisung für jedes Element haben:

let s = seq { 1; 2; 3; 4; 5 }

let daysOfWeek includeWeekend =
    [
        "Monday"
        "Tuesday"
        "Wednesday"
        "Thursday"
        "Friday"
        if includeWeekend then
            "Saturday"
            "Sunday"
    ]

Wenn Sie ein einzelnes yield-Schlüsselwort angeben, muss yield auch für jedes andere Element verwendet werden.

Implizite yield-Anweisungen werden nicht aktiviert, wenn sie in einem Ausdruck verwendet werden, der auch yield! verwendet, um beispielsweise eine Sequenz zu vereinfachen. Sie müssen in diesen Fällen weiterhin yield verwenden.

Platzhalterbezeichner

In F#-Code, der Klassen enthält, muss der Selbstbezeichner in Memberdeklarationen immer explizit sein. In Fällen, in denen der Selbstbezeichner nie verwendet wird, war es allerdings üblich, einen doppelten Unterstrich zu verwenden, um namenlose Selbstbezeichner anzugeben. Sie können jetzt einen einzelnen Unterstrich verwenden:

type C() =
    member _.M() = ()

Dies gilt auch für for-Schleifen:

for _ in 1..10 do printfn "Hello!"

Lockerungen für Einzüge

Vor F# 4.7 waren für primäre Konstruktoren und statische Memberargumente übermäßige Einzüge erforderlich. Jetzt ist nur noch ein einziger Einzugsbereich erforderlich:

type OffsideCheck(a:int,
    b:int, c:int,
    d:int) = class end

type C() =
    static member M(a:int,
        b:int, c:int,
        d:int) = 1