F# fsharp 与 C# 库 (CsvHelper) 互操作

F# fsharp interop with C# library (CsvHelper)

我已经成功地使用库 CsvHelper 在 F# 中执行一些 CSV 操作(我无法使用 Fsharp.Data CsvProvider 完成的事情)。

在他们的文档中,他们通过以下方式操纵 headers:

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

我正在尝试做类似的事情(将所有 headers 更改为小写),但我还没有弄清楚如何处理这个委托。

我正在尝试以下操作,但无法编译。

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>

您看到的错误可能与类型不匹配有关,或者与不支持 'equality' 约束的函数类型有关。这是因为表达式

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

解析为运算符 Microsoft.FSharp.Core.Operators.(=) 的调用,左侧为 属性 getter,右侧为内联函数定义。相反,你想要一个赋值表达式 expr <- expr ,在左侧有一个 属性 setter 调用:

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

在 F# 语言中,= 标记是一个常见的混淆来源,因为根据上下文,它可以代表两种不同的事物:

  • 通用相等运算符=,如上,或
  • 值、函数、类型或成员定义上下文中的绑定,例如 let x = 42

Edit 事实证明,所讨论的 属性 的预期类型是 System.Func<System.Type, string, string>,这意味着您需要提供一个额外的参数随后不要使用。可以用通配符表示:fun _ header -> header.ToLower()