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