将内部判别联合的实例从 F# 初始化为 C#

isl*_*mdi 3 c# f# c#-to-f#

我有一个通过 dll 从 F# 导出的可区分联合类型,用于 C#:

type Argument =
  | IntValue
  | FloatValue
  | BoolValue of bool
Run Code Online (Sandbox Code Playgroud)

在C#中我可以初始化类似Argument.NewBoolValue(true),但其他两种类型IntValueFloatValue没有型式通过F#编译器生成的,因此标记为内部的,是有办法来初始化它们在C#中?

Ser*_*kiy 6

如果可区分的联合案例没有任何有效负载,则不会NewXXX生成任何方法。因为这种联合情况的所有实例都是相同的,并且不需要创建功能。所以改用静态属性

Argument.IntValue
Argument.FloatValue
Run Code Online (Sandbox Code Playgroud)

在内部,这些属性只返回相应用例的单例实例:

internal static readonly Argument _unique_IntValue = new _IntValue();

public static Argument IntValue => _unique_IntValue;
Run Code Online (Sandbox Code Playgroud)

在这个反编译的片段中可以观察到更多有趣的细节。