【发布时间】: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# :)