When consuming C# libraries in F# projects, out parameters will be interpreted in F# with type byref. For example:
public class Arithmetic { public static void sumAndDifference( int a, int b, out int sum, out int difference) { sum = a + b; difference = a - b; } }
Here, sumAndDifference has the following signature when the library is referenced from an F# project:
The literal way to call the method is as follows, declaring reference value up-front and de-referencing them for use after the method call:
let sum : int ref = ref 1 let difference : int ref = ref 2 Arithmetic.sumAndDifference(5, 3, sum, difference ) printfn "Sum = %d, Difference = %d" !sum !difference
But F# also provides a much more concise syntax, allowing the out parameters to appear on the left hand side of an assignment:
let sum, difference = Arithmetic.sumAndDifference(5, 3) printfn "Sum = %d, Difference = %d" sum difference
This syntax is so much cleaner and avoids any mention of references.
Pingback: How to extend F# discriminated unions for use from C# | musingstudio