4

我写了这段代码

type Test =
    | Age of int
    | Name of string;;

let x = Age(10);;


if (x.GetType() = typeof<Test>) then printfn "true" else printfn "false";;

代码打印错误。但这让我感到困惑,因为不是类型测试的年龄吗?

另外,有没有更好的方法来比较 F# 中的类型.GetType() = typeof<>很长。我试过:?了,但我认为这是用于类型转换而不是比较类型。

4

3 回答 3

4

简单的答案是,这样做:

if (x :> obj) :? Test then printfn "true" else printfn "false"

这个问题是由于 DU 的实现(使用内部类和标签)和 F# 类型系统的限制(不承认实现)造成的。

如您所见,类型xFSI_0001+Test+Age,而 F# 不将其识别为 的子类型Test

于 2013-08-04T18:36:25.203 回答
2

引用规范

编译的联合类型 U 具有:

· 每个空联合案例 C 都有一个 CLI 静态 getter 属性 UC。此属性获取一个代表每个此类案例的单例对象。

· 一个 CLI 嵌套类型 UC 用于每个非空联合案例 C。此类型具有联合案例的每个字段的实例属性 Item1、Item2....,如果只有一个字段,则具有单个实例属性 Item。但是,只有一种情况的编译联合类型没有嵌套类型。相反,联合类型本身扮演了案例类型的角色。

我们看到它Age被实现为父 DU 的嵌套类型。因此,您可以使用Type.GetNestedTypes获取 DU 的所有子类型,然后测试每个子类型以查看类型是否匹配。

于 2013-08-04T21:52:32.230 回答
-2

但这让我感到困惑,因为不是颜色类型的测试吗?

没有类型ColorTest它本身就是一个类型,所以它没有类型。所以你的问题是无稽之谈。

也许你的意思是问为什么答案是这样的?如果是这样,这是 F# 当前选择在内部表示此类值的方式的结果。

于 2013-08-05T23:57:56.787 回答