【问题标题】:Return record option as null when calling from C#从 C# 调用时将记录选项返回为 null
【发布时间】:2012-02-20 03:33:10
【问题描述】:

是否有可能将 record option 值从 F# 返回到 C# 作为空值?我想在 F# 程序集中封装一些逻辑,并尽可能多地隐藏在“对 C# 更自然”的外观后面。这是一些综合示例:

type Data = { DataField1: int; DataField2: string }

返回 C# 的代码如下所示:

type SomeFacade() =
    let data = Some { DataField1 = 1; DataField2 = "hello" }  

    member x.GetData() = if Option.isSome data then Option.get data else null

但不允许使用空值。

  • 我可以尝试使用[<AllowNullLiteral>] 属性,但它不能用于记录类型。
  • 我可以使用Class 而不是Record,但在F# 中使用它会更复杂,因为大部分工作都应该在F# 部分中完成。而且我喜欢通过使用 with 关键字复制另一个记录值来创建记录值的极其方便的方法。
  • 甚至可以在 F# 程序集中使用 Data 作为记录,并在暴露给 C# 程序集时将其转换为某个中间类 DataClass,但这看起来很尴尬。

有什么解决办法吗? (我不会在 F# 代码中使用空值,但我想将空值返回给 C# 代码)。

【问题讨论】:

  • 返回选项类型有什么问题?
  • 没什么...但我只是在一个只包含 C# 项目的大型解决方案中使用 F#,我不希望在 F# 程序集之外看到过于特定于 F# 的类型,我们将其命名为“to隐藏实施细节”。他们可以看到,但如果他们不看到会更好。我们还没有使用 F#,所以我不希望我的同事对“未知”的编程语言感到害怕 :)
  • 是的,先生。它适用于 Mercurial 的采用,所以也许它也适用于 F# :)

标签: c# f# null option record


【解决方案1】:

对于记录类型,

Operators.Unchecked.defaultof<Data>

null(刚刚使用 fsi 测试过)

这可能是最简单的解决方案

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-24
    • 2016-11-21
    • 2023-03-07
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 2012-12-17
    相关资源
    最近更新 更多