2010-05-01 11 views
6

J'ai un objet en F # comme suit ...Créer un objet en C# d'un objet F # avec des arguments optionnels

type Person(?name : string) = 
    let name = defaultArg name "" 
    member x.Name = name 

Je veux être en mesure de créer une instance de cet objet dans un projet C#. J'ai ajouté comme référence les bibliothèques correctes au projet et peux voir l'objet via intellisense mais je ne suis pas sûr sur le bon syntaxt pour créer une instance de l'objet.

Actuellement j'ai les éléments suivants dans mon projet C# - que le compilateur n'aime pas ...

var myObj1 = new Person("mark");    
+0

Que dit exactement le compilateur? Le compilateur C# de Microsoft est généralement assez explicite lorsqu'il rencontre des choses qu'il ne comprend pas. –

Répondre

9

Pour ajouter quelques détails, le compilateur F # utilise une approche différente pour représenter les paramètres optionnels, ce qui n'est pas (actuellement) compatible avec l'approche C# 4.0. F # vous permet simplement d'utiliser une syntaxe plus agréable lorsque le paramètre a le type option<'a> (et est marqué comme facultatif). Vous pouvez l'utiliser tel quel ou vous pouvez utiliser la fonction defaultArg pour fournir la valeur par défaut dans votre code. En C#, le paramètre est représenté spécialement dans les métadonnées (fonctionnalité spécifique .NET 4.0) et la valeur par défaut est dans les métadonnées. Malheureusement, il n'y a aucun moyen de créer un paramètre optionnel compatible C# 4.0 en F #.

Si vous voulez faire le code C# un peu peu plus agréable, vous pouvez définir une classe utilitaire statique qui vous permet d'utiliser l'inférence de type lors de la création option<'a> valeurs:

static class FSharpOption { 
    static FSharpOption<T> Some<T>(T value) { 
    return new FSharpOption<T>(value); 
    } 
} 

// Then you can write just: 
var myObj1 = new Person(FSharpOption.Some("mark")); 

Ou vous pouvez modifier votre F # déclaration d'utiliser des méthodes/constructeurs surchargées, qui travaille dans les deux langues:

type Person(name) = 
    do printfn "%s" name 
    // Add overloaded constructor with default value of name' 
    new() = Person("") 
5

Les arguments optionnels fonctionnent différemment en F # qu'ils ne le font en C#, donc je crois que vous aurez besoin d'imiter l'approche F # dans votre code C#:

var myObj1 = new Person(new FSharpOption<string>("mark")); 
9

Vous pouvez être plus heureux simplement fournir deux du constructeur surcharges:

type Person(name : string) = 
    new() = Person("") 
    member x.Name = name 

Ensuite, il fonctionnera bien à la fois F # et C#.

0

Vous pouvez créer une classe Person avec les deux F # et C# -Compatible -Compatible arguments du constructeur en option comme ceci:

// F#-compatible ctor with optional args 
type Person(?name, ?dummy) = 
    let name = defaultArg name "" 

    // C#-compatible ctor with optional arg 
    new([<Optional; DefaultParameterValue "">] name) = 
     Person(name, null) 

    member x.Name = name 

Mauricio Scheffer a élargi plus loin sur ce sujet here.

Questions connexes