Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

F# extension methods in C#

If you were to define some extension methods, properties in an assembly written in F#, and then use that assembly in C#, would you see the defined extensions in C#?

If so, that would be so cool.

like image 472
Joan Venge Avatar asked Mar 31 '09 17:03

Joan Venge


2 Answers

[<System.Runtime.CompilerServices.Extension>] module Methods =        [<System.Runtime.CompilerServices.Extension>]        let Exists(opt : string option) =                     match opt with        | Some _ -> true                          | None -> false 

This method could be used in C# only by adding the namespace (using using) to the file where it will be used.

if (p2.Description.Exists()) {   ...} 

Here is a link to the original blogpost.

Answering question in comments "Extension Static Methods":

namespace ExtensionFSharp   module CollectionExtensions =     type System.Linq.Enumerable with        static member RangeChar(first:char, last:char) =        {first .. last} 

In F# you call it like so:

open System.Linq  open ExtensionFSharp.CollectionExtensions   let rangeChar = Enumerable.RangeChar('a', 'z')  printfn "Contains %i items" rangeChar.CountItems 

In C# you call it like so:

using System; using System.Collections.Generic; using ExtensionFSharp;      class Program     {         static void Main(string[] args)         {             var method = typeof (CollectionExtensions).GetMethod("Enumerable.RangeChar.2.static");               var rangeChar = (IEnumerable<char>) method.Invoke(null, new object[] {'a', 'z'});             foreach (var c in rangeChar)             {                 Console.WriteLine(c);             }         }     } 

Now, give me my freaking medal!

like image 123
alex Avatar answered Sep 19 '22 14:09

alex


Despite my other answer, I did just try this with the F# CTP (on VS shell) and C# Express from my box at home (all free dev tools!), and this works:

F#

#light namespace MyFSharp  // C# way [<System.Runtime.CompilerServices.Extension>] module ExtensionMethods =     [<System.Runtime.CompilerServices.Extension>]     let Great(s : System.String) = "Great"      // F# way     type System.String with         member this.Awesome() = "Awesome"     let example = "foo".Awesome()         

C#

using System; using MyFSharp;  // reference the F# dll class Program {     static void Main(string[] args)     {         var s = "foo";         //s.Awesome(); // no         Console.WriteLine(s.Great());  // yes     } } 

I was not aware you could do this; nifty. Credit to @alex.

like image 22
Brian Avatar answered Sep 18 '22 14:09

Brian