Soweit ich weiß, hat F # keinen integrierten Operator, der C# as
entspricht, also müssen Sie etwas kompliziertere Ausdrücke schreiben. Alternativ zu Ihren Code mit match
, könnten Sie auch if
verwenden, da der Bediener :?
kann Gebrauch in der gleichen Weise wie is
in C# sein:
let res = if (inputValue :? Type1) then inputValue :?> Type1 else null
Sie können natürlich auch eine Funktion schreiben, um dieses Verhalten zu kapseln (durch Schreiben eine einfache generische Funktion, die ein Object
und wirft es auf den angegebenen generischen Typparameter nimmt):
let castAs<'T when 'T : null> (o:obj) =
match o with
| :? 'T as res -> res
| _ -> null
Diese Implementierung liefert null
, so erfordert es, dass der Typ-Parameter null
als Stütze hat er-Wert (alternativ könnten Sie Unchecked.defaultof<'T>
verwenden, was default(T)
in C# entspricht). Jetzt können Sie nur schreiben:
let res = castAs<Type1>(inputValue)
Dies funktioniert, wenn der Typ statisch ist. Irgendeine Idee, was zu tun ist, wenn der Typ zur Laufzeit definiert ist? Ich suche nach einem F # -Aquivalent von http://StackOverflow.com/a/19068042/23059. –