Luis Fallas beschreibt in seinem Blog (“Exploring Beautiful Languages”) an einem sehr schönen Beispiel, wie man die F# option types mit Hilfe von Extension Methods in C# verwenden kann.
Hier ist eine generische Variante zu seiner Exists()-Methode:
open System.Runtime.CompilerServices
[<Extension>]
module Extensions =
[<Extension>]
let Exists(opt : 'a option) =
match opt with
| Some _ -> true
| None –> false
Auf ähnlichem Wege kann man übrigens auch die generischen F#-Listen in System.Collections.Generic.List<T> umwandeln:
[<Extension>]
let ToCSharpList(list : 'a list) =
let csharpList =
new System.Collections.Generic.List<'a>()
list |> List.iter (fun item -> csharpList.Add item)
csharpList
Der umgekehrte Weg (von C# nach F#) ist fast analog, allerdings muss man die Liste drehen:
static class Extensions
{
/// <summary>
/// Converts a System.Collections.Generic.List<T>
/// in the corresponding F# list.
/// </summary>
public static Microsoft.FSharp.Collections.List<T>
ToFSharpList<T>(this List<T> list)
{
var fSharpList =
Microsoft.FSharp.Collections.List<T>.Empty;
for (int i = list.Count - 1; i >= 0; i--)
fSharpList =
Microsoft.FSharp.Collections.List<T>.Cons(
list[i],
fSharpList);
return fSharpList;
}
}