2010-05-01 60 views
6

我在F#一個對象,如下所示:創建從F#對象在C#中的對象...與可選參數

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

我希望能夠在C#項目,以創建該對象的實例。我已經爲項目添加了一個引用正確的庫,並且可以通過intellisense查看對象,但是我無法確定創建對象實例的正確語法。

目前,我有我的C#項目如下 - 該編譯器不喜歡......

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

編譯器說什麼?微軟的C#編譯器在遇到不理解的事情時通常很明確。 – 2010-05-01 14:59:03

回答

9

要添加一些細節,F#編譯器使用不同的方法來表示可選參數,這與C#4.0方法不兼容(當前)。當參數的類型爲option<'a>(並標記爲可選)時,F#只允許您使用更好的語法。您可以按原樣使用它,也可以使用defaultArg函數在您的代碼中提供默認值

在C#中,該參數在元數據(.NET 4.0特定功能)中特別表示,並且元數據中的默認值爲。不幸的是,在F#中無法創建與C#4.0兼容的可選參數。

如果你想在C#代碼一點位的更好,你可以定義一個靜態實用類,允許你使用類型推斷創建option<'a>值時:

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

或者,您可以修改您的F#聲明使用重載的方法/構造函數,這兩種語言的工作:

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

可選參數工作方式不同在F#比在C#中做的,所以我相信你會需要仿效F#的方式在你的C#代碼:

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

你可能會更快樂只是提供了構造函數的兩個重載:

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

然後從F#和C#都可以正常工作。

0

您可以創建一個Person類既F#兼容和C#兼容可選的構造函數的參數是這樣的:

// 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在此主題上進一步擴展here