从C#调用时返回记录选项为null

Dmi*_*nov 4 c# null f# record option

是否有可能将record optionF#中的值返回到C#作为空值?我想在F#程序集中封装一些逻辑,并尽可能地隐藏在Facade后面"对C#更自然".这是一些合成的例子:

type Data = { DataField1: int; DataField2: string }
Run Code Online (Sandbox Code Playgroud)

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

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

    member x.GetData() = if Option.isSome data then Option.get data else null
Run Code Online (Sandbox Code Playgroud)

但是不允许使用空值.

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

有什么解决方案吗?(我不打算在F#代码中使用空值,但我想将空值返回给C#代码).

Joh*_*mer 6

对于记录类型,

Operators.Unchecked.defaultof<Data>
Run Code Online (Sandbox Code Playgroud)

null(刚刚使用fsi测试)

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