首页 > 解决方案 > 将内部可区分联合的实例从 F# 初始化为 C#

问题描述

我有一个通过 F# 中的 dll 导出的可区分联合类型,以在 C# 中使用:

type Argument =
  | IntValue
  | FloatValue
  | BoolValue of bool

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

标签: c#f#c#-to-f#

解决方案


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

Argument.IntValue
Argument.FloatValue

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

internal static readonly Argument _unique_IntValue = new _IntValue();

public static Argument IntValue => _unique_IntValue;

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


推荐阅读