簡體   English   中英

使用可選參數從F#對象在C#中創建對象

[英]Create an object in C# from an F# object with optional arguments

我在F#中有一個對象如下......

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

我希望能夠在C#項目中創建此對象的實例。 我已經將正確的庫作為參考添加到項目中,並且可以通過intellisense查看對象,但是我不確定在正確的語法上創建對象的實例。

目前我的C#項目中有以下內容 - 編譯器不喜歡...

var myObj1 = new Person("mark");            

您可能更樂意提供構造函數的兩個重載:

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

然后從F#和C#都可以很好地工作。

為了添加一些細節,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("")

可選參數在F#中的工作方式與在C#中的工作方式不同,因此我認為您需要在C#代碼中模擬F#方法:

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

您可以使用F#-compatible和C#兼容的可選構造函數參數創建Person類,如下所示:

// 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在這里進一步擴展了這一主題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM