首页 > 解决方案 > F# struct 与 C# 的判别联合互操作:强制转换为特定情况

问题描述

使用参考判别联合,例如

type Result<'T,'TError> =
    | Ok of 'T
    | Error of 'TError

您可以转换为 C# 中的一种情况,var error = (Result<T,TError>.Error) result但不能使用等效的 struct 判别联合进行编译。

如何在 C# 互操作场景中转换为特定的结构判别联合情况?或者,如何在 CLR 类型中表示结构判别联合案例?

标签: f#

解决方案


首先,没有等效的 struct DU。切换到 struct DU 时,编译器将强制您为字段命名。

[<Struct>]
type Result<'T,'TError> =
    | Ok of 'T
    | Error of 'TError
;;

  type Result<'T,'TError> =
  -----^^^^^^

error FS3204: If a union type has more than one case and is a struct, 
then all fields within the union type must be given unique names.

所以,你可以这样翻译:

[<Struct>]
type Result<'T,'TError> =
    | Ok of ok: 'T
    | Error of error: 'TError

这将创建一个具有两个字段okerror相应类型的结构,实际上它有点复杂,因为它将创建内部支持字段并将这些名称作为属性呈现给您。有关更多详细信息,请参见Sharplab

因此,您将能够访问以下属性:

var error = result.error;

推荐阅读