从 F# 实例化 C# 9 记录

Ret*_*ard 3 f#

如果我定义了 C# 9 记录:

public record Reading
{
    public long Timestamp { get; init; }
    public float TemperatureCelsius { get; init; }
}
Run Code Online (Sandbox Code Playgroud)

如何从 F# (5.01) 实例化它?

let newReading () =
   // ???
Run Code Online (Sandbox Code Playgroud)

感觉应该很简单,但我似乎无法让它发挥作用。

bri*_*rns 5

我创建了两个项目,都使用 .NET Core 5.0:

  • CSharpProj:C# 9 类库
  • FSharpProj:F# 5 控制台应用程序

如果我像普通类类型一样对待它,从 F# 实例化 C# 记录对我来说效果很好:

open CSharpProj
let reading = Reading()
Run Code Online (Sandbox Code Playgroud)

但是,我无法从 F#Timestamp或成功设置TemperatureCelsius。看来F# 还不理解 C# 的 init setter。以下尝试编译良好:

let reading = Reading(Timestamp = 1L, TemperatureCelsius = 1.0f)
Run Code Online (Sandbox Code Playgroud)

InvalidProgramException在运行时生成一个。我认为 F# 团队会在某个时候解决这个问题。同时,作为解决方法,我将 C# 记录类型更改为:

public record Reading(long Timestamp, float TemperatureCelsius)
{
}
Run Code Online (Sandbox Code Playgroud)

现在,F# 中的相同调用成功设置了这两个属性。