【问题标题】:F#: Converting FSharpRef to C# object referenceF#:将 FSharpRef 转换为 C# 对象引用
【发布时间】:2017-09-29 13:31:38
【问题描述】:

我在另一个 C# 项目中使用我的 F# 类库。我调用的函数返回一个像这样的对象:

type Item =
{ Title: string
  Items: List<Item ref> }

问题是我在 C# 中使用它时,Items 属性的类型是 List&lt;FSharpRef&lt;Item&gt;&gt;。 所以问题是:

如何在不丢失对象引用的情况下将其转换为 List&lt;Item&gt;(在 F# 中)?

即如果两个 Item 对象在其列表中引用了第三个对象,则它们应该在 C# 中引用同一个对象。

【问题讨论】:

  • 解释一下为什么首先在 F# 代码中使用 refs 可能会对您有所帮助。
  • @kvb 基本上,“Item”类型具有单向图的结构,其中两个或多个节点可能指向同一个节点。
  • 但是你不需要 ref ......从 .NET 类型系统的角度来看,项目已经是引用类型。
  • @kvb 这是一个好点!但是,这只有在对象不可变时才有效,对吧?
  • 这取决于你想要改变什么;您可以将字段标记为mutable 以改变它们,但这与您现在拥有的不同(现在您可以更改Items 列表的各个元素,但不能更改列表的长度)。

标签: c# f# ref


【解决方案1】:

如果您希望项目仍位于 C# 中的 ref 单元格中,那么您可以保持 F# 原样,并在将其与 .Value 属性一起使用之前在 C# 中取消引用每个 FSharpRef

【讨论】:

  • 这是一个选项,但 F# 库被其他团队成员使用,他们宁愿在没有任何额外步骤的情况下使用它。在 C# 中声明 Item 类也是一种选择(我猜应该可以),但它也涉及外部(非 F#)代码。我认为有一些标准的方法可以做到这一点,但我想,在 .NET 项目中使用 F# 并不是很流行。
  • 我不完全确定将 Item 设为 C# 类有何帮助,但您可能也可以从 F# 生成相同的类,而不是使用记录。
【解决方案2】:

感谢所有参与讨论的人!出现了以下解决方案:

  1. 取消引用 C# 中的值(通过创建某种flatMap);
  2. 根本不使用ref - 如果值应该是不可变的,则可以正常工作;
  3. 在 F# 中使用 ref,但返回不需要 ref 的另一种类型的对象。

我使用了第三种策略,因为无论如何我都需要将对象转换为其他类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 2016-04-24
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    相关资源
    最近更新 更多