Note: I’m going through draft posts that go back to 2014 and publishing where they still may have value. They may not be 100% upto date but better published late than never.
The intention of this post is to demonstrate how various bits of F# code are viewed from C# code. Obviously as both are .NET languages compiling to IL they can call one another’s code.
F# modules
Let’s start at the top, an F# module. So let’s look at a simple module
module MyModule let squared x = x * x
The module will appears to C# as a static class and the function squared will become a static method, for example
public static class MyModule { public static int squared(int x); }
F# inferred the type to be an int
Ofcourse from C# we’ll call this function like any other static function
int result = MyModule.squared(4);
Null
The preference within F# is to use the Option type. But if you are working in C# and not wanting to include F# specific types you might prefer to still return a null. However if you are doing something like the following
match results with | null -> null | a -> new Thing(a)
This will fail to compiler with an error such as “The type ‘Thing’ does not have ‘null’ as a proper value.”
We can solve this by marking the Thing type with the attribute AllowNullLiteral, for example
[<AllowNullLiteral>] type Thing() = // members etc.
or we might change the origina F# code to
match results with | null -> Operators.Unchecked.defaultof<Scale> | a -> new Thing(a)