2010-02-11 4 views

Antwort

68

fand ich dies in einem Blog: "What does this C# code look like in F#? (part one: expressions and statements)"

C# einen Operator namens " Standard " , die die Null-Initialisierung Wert eines bestimmten Typs zurückgibt:

default(int) 

Es hat begrenzten Nutzen; Am häufigsten können Sie Standard (T) in einem generischen verwenden. F # hat ein ähnliches Konstrukt als Bibliothek Funktion:

Unchecked.defaultof<int> 
31

Technisch # Funktion Unchecked.defaultof<'a> F gesprochen ist ein Äquivalent zu den default Operator in C#. Aber ich denke, es ist erwähnenswert, dass defaultof als unsichere Sache in F # betrachtet wird und sollte nur verwendet werden, wenn es wirklich notwendig ist (genau wie mit null, die auch in F # entmutigt ist).

In den meisten Fällen können Sie die Verwendung von defaultof mithilfe des Typs option<'a> vermeiden. Sie können damit darstellen, dass ein Wert noch nicht verfügbar ist.

Hier ist jedoch ein kurzes Beispiel, um die Idee zu demonstrieren. Der folgende C# -Code:

T temp = default(T); 
// Code that may call: temp = foo() 
if (temp == default(T)) temp = bar(arg) 
return temp; 

Würde wahrscheinlich wie dies in F # geschrieben werden (Imperativ Funktionen verwenden):

let temp = ref None 
// Code that may call: temp := Some(foo()) 
match !temp with 
| None -> bar(arg) 
| Some(temp) -> temp 

Natürlich ist dies auf Ihr spezielles Szenario hängt und in einigen Fällen defaultof ist die einzige Sache, du kannst tun. Allerdings wollte ich nur darauf hinweisen, dass defaultof weniger häufig in F # verwendet wird.

+1

In Ihrem C# -Beispiel verwenden Sie einen Zuweisungsoperator anstelle eines Gleichheitsoperators in der if-Anweisung. Ist das Absicht? – doppelgreener

+0

Ich sollte sagen, es funktioniert nicht für mich, lass t = ref Keine t: = Einige (context.Items.FirstOrDefault (Spaß ii -> ii.Name = i.Name)) übereinstimmen! T mit | Etwas es -> - fertig hier ist es sogar null | Keine -> ignorieren –

Verwandte Themen