F#返回的ICollection(F# return ICollection)

2019-07-20 00:53发布

我用C#创建一个图书馆工作。 我一直对移植一些代码,F#,但必须使用相当多的基础类型从C#库。

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

我的F#代码工作正常,需要返回F#序列/列表。

我尝试下面的代码片段,每个产生误差。

  • F#成员的返回类型是一个名为recoveryList型回收率列表类型
  • 在类的公共字段是包含两个ICollection的对象类本身

     this.field.Collection1 = recoveries 

这给预计将有类型ICollection的错误,但有型的回收率列表

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

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

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

同样的错误以上 - 预期的ICollection但类型列表

有任何想法吗? 这些操作从一个C#点似乎有效,并列出/ ResizeArray实现的ICollection所以...我很困惑如何分配的值。

我可以改变底层的C#库的类型,但是这可能有其他的含义。

谢谢

Answer 1:

F#不喜欢做C#的隐式转换。 因此,即使System.Collections.Generic.List<'T>实现ICollection界面,你不能直接设置一些ICollection -typed属性的实例System.Collections.Generic.List<'T>

解决方法是容易做的-所有你需要做的就是增加一个显式上溯造型ICollectionResizeArray<'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# return ICollection