[英]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.