gpt4 book ai didi

F# 返回 ICollection

转载 作者:行者123 更新时间:2023-12-01 10:01:55 27 4
gpt4 key购买 nike

我正在使用用 C# 创建的库。我一直致力于将一些代码移植到 F#,但必须使用 C# 库中的相当多的基础类型。

一段代码需要计算一个值列表并将其分配给类中的公共(public)字段/属性。该字段是一个包含两个 ICollection 的 C# 类。

我的 F# 代码运行良好,需要返回一个 F# Seq/List。

我尝试了以下每个都会产生错误的代码片段。

  • F# 成员的返回类型是一个名为 recoveryList 的类型,类型为 Recoveries list
  • 类中的公共(public)字段,它是一个本身包含两个 ICollection 对象的类

    this.field.Collection1 = recoveries

这给出了错误 Expected to have type ICollection but has type Recoveries list

this.field.Collection1 = new ResizeArray<Recoveries>()

给出了预期的错误类型 ICollection 但它是 ResizeArray

this.field.Collection1 = new System.Collections.Generic.List<Recoveries>()

与上面相同的错误 - 预期的 ICollection 但类型是 List

有什么想法吗?从 C# 的角度来看,这些操作似乎是有效的,并且 List/ResizeArray 实现了 ICollection,所以...我很困惑如何分配值。

我可以更改底层 C# 库的类型,但这可能会产生其他影响。

谢谢

最佳答案

F# 不像 C# 那样进行隐式转换。所以即使System.Collections.Generic.List<'T>实现 ICollection接口(interface),你不能直接设置一些ICollection类型属性到 System.Collections.Generic.List<'T> 的一个实例.

尽管修复很简单——您需要做的就是向 ICollection 添加一个显式向上转换。给你的ResizeArray<'T>System.Collections.Generic.List<'T>分配之前:

// Make sure to add an 'open' declaration for System.Collections.Generic
this.field.Collection1 = (recoveries :> ICollection)

this.field.Collection1 = (ResizeArray<Recoveries>() :> ICollection)

关于F# 返回 ICollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14912548/

27 4 0