簡體   English   中英

與C#庫進行F#fsharp互操作(CsvHelper)

[英]F# fsharp interop with C# library (CsvHelper)

我已經成功地使用庫CsvHelper在F#中進行了一些CSV操作(我無法使用Fsharp.Data CsvProvider完成這些操作)。

在他們的文檔中,他們通過以下方式操作標頭:

csv.Configuration.PrepareHeaderForMatch = header => header.Replace( " ", string.Empty );

我正在嘗試做類似的事情(將所有標頭更改為小寫),但是我還沒有弄清楚如何處理該委托。

我正在嘗試以下操作,但無法編譯。

csv.Configuration.PrepareHeaderForMatch = (fun header -> header.ToLower())

任何幫助是極大的贊賞。

謝謝。


我嘗試過@kaefer建議分配“ PrepareHeaderForMatch”的建議,因為它是C#getter; setter;。

csv.Configuration.PrepareHeaderForMatch <- fun header -> header.ToLower()

如我的評論中所述,編譯器抱怨類型不匹配,因為c#屬性期望:

System.Func<System.Type, string, string>

在此處輸入圖片說明

您看到的錯誤可能與類型不匹配有關,或者與不支持“相等”約束的函數類型有關。 這是因為表達式

csv.Configuration.PrepareHeaderForMatch = (fun header -> header.ToLower())

解析為運算符Microsoft.FSharp.Core.Operators.(=)的調用,左側帶有屬性getter,右側帶有內聯函數定義。 相反,您需要一個賦值表達式expr <- expr ,在左側具有屬性設置器調用:

csv.Configuration.PrepareHeaderForMatch <- fun header -> header.ToLower()

在F#語言中, =標記是造成混淆的常見原因,因為取決於上下文,它可以代表兩種不同的含義:

  • 通用相等運算符=如上所述,或
  • 在值,函數,類型或成員定義的上下文中進行綁定,例如let x = 42

編輯原來,所討論的屬性的預期類型為System.Func<System.Type, string, string> ,這意味着您需要提供一個額外的參數,該參數隨后將不再使用。 可以用通配符表示: fun _ header -> header.ToLower()

暫無
暫無

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

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