2010-05-01 11 views
6

Tengo un objeto en C# de la siguiente manera ...Crear un objeto en C# de un # objeto F con argumentos opcionales

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

Quiero ser capaz de crear una instancia de este objeto en un proyecto de C#. He agregado como referencia las bibliotecas correctas para el proyecto y puedo ver el objeto a través de intellisense; sin embargo, no estoy seguro de la sintaxis correcta para crear una instancia del objeto.

Actualmente tengo el siguiente en mi proyecto de C# -, que el compilador no le gusta ...

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

¿Qué dice exactamente el compilador? El compilador C# de Microsoft suele ser bastante explícito cuando encuentra cosas que no comprende. –

Respuesta

9

Para agregar algunos detalles, el compilador F # utiliza un enfoque diferente para representar los parámetros opcionales, que no es (actualmente) compatible con el enfoque C# 4.0. F # simplemente le permite usar una sintaxis más agradable cuando el parámetro tiene el tipo option<'a> (y está marcado como opcional). Puede usarlo tal cual, o puede usar la función defaultArg para proporcionar el valor predeterminado en su código.

En C#, el parámetro se representa especialmente en los metadatos (característica específica de .NET 4.0), y el valor predeterminado se especifica en los metadatos. Desafortunadamente, no hay forma de crear un parámetro opcional compatible con C# 4.0 en F #.

Si desea hacer que el código C# un poco-poco más agradable, se puede definir una clase de utilidad estática que le permite utilizar la inferencia de tipos al crear option<'a> valores:

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")); 

o puede modificar su F # Declaración de utilizar métodos sobrecargados/constructores, que funciona en las dos lenguas:

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

argumentos opcionales funcionan de forma diferente en C# que lo hacen en C#, por lo que creo que usted va a necesita para emular el enfoque # F en su código C#:

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

Usted puede ser feliz sólo proporcionar dos sobrecargas del constructor:

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

Entonces funcionará bien con F # y C#.

0

Usted puede crear una clase Persona con ambos # -Compatible argumentos de constructor opcionales F # -Compatible y C de esta manera:

// 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 se ha expandido con más información sobre este tema here.

Cuestiones relacionadas