【问题标题】:F# fsharp interop with C# library (CsvHelper)F# fsharp 与 C# 库的互操作 (CsvHelper)
【发布时间】:2019-04-10 12:54:30
【问题描述】:

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

在他们的文档中,他们通过以下方式操作标头:

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

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

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

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

非常感谢任何帮助。

谢谢。


我已经尝试过分配“PrepareHeaderForMatch”的@kaefer 建议,因为它是 C# getter;setter;

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

正如我在评论中指出的那样,编译器抱怨类型不匹配,因为 c# 属性是预期的:

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

【问题讨论】:

    标签: c# dll f# delegates interop


    【解决方案1】:

    您看到的错误可能与类型不匹配或不支持“平等”约束的函数类型有关。这是因为表达式

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

    解析为运算符Microsoft.FSharp.Core.Operators.(=) 的调用,左侧有一个属性getter,右侧有一个内联函数定义。相反,您需要一个赋值表达式expr &lt;- expr,在左侧有一个属性设置器调用:

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

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

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

    编辑 结果是,所讨论的属性的预期类型是System.Func&lt;System.Type, string, string&gt;,这意味着您需要提供一个随后不使用的额外参数。可以用通配符表示:fun _ header -&gt; header.ToLower()

    【讨论】:

    • 您的解释确实对我的理解有很大帮助。然而,我仍然无法掌握如何匹配 c# 程序集所期望的委托。我使用了您建议的代码,但出现以下编译器错误: ---------------------------------- --------------------- 该类型与 System.Func 类型不兼容
    • 绝不是“作业”。
    • @FyodorSoikin 程序集在 C# 中,并且这个道具是可变的。
    • 您答案的最后一行表示等号可以表示分配,如let x = 42。这不是一项任务。
    • @FyodorSoikin 考虑到第三种情况= 还有另一个用途:在方法调用中的命名参数或构造函数调用中的可设置属性,从不有点强。否则同意并编辑
    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    相关资源
    最近更新 更多