1

所以我有这个代码:

type Zero = One = 1 | Two = 2 | Three = 3
type Four = Five = 5 | Six = 6 | Seven = 7

let test_1 (x : bool) : Type =
    if x
    then typeof<Zero>
    else typeof<Four>

let test_2 () =
     let ty = test_1 true
     let e = enum<ty>(1)
     ...

但是在最后一行,我收到一个错误:Type ty not defined.

有什么建议么?

编辑:

或者可能是这样的:

let test_3 (x : bool) (i : int) : obj =
    if x
    then enum<Zero>(i) :> obj
    else enum<Four>(i) :> obj

我在想有什么方法可以恢复类型安全吗?

也许是这样的?

let test_4 (x : bool) (i : int) : obj * Type =
    if x
    then enum<Zero>(i) :> obj, typeof<Zero>
    else enum<Four>(i) :> obj, typeof<Four>

然后像这样使用它:

let test_5 () =
    let v,t = test_4 true 1
    let o = v :?> t
    ...

这在未定义 t 的最后一行抱怨。

基本上,我想要做的是能够返回这些不同的枚举,而无需将零和四包装到 DU 中。

4

1 回答 1

2

你不能这样做,“类型安全”意味着你(编译器)静态地知道类型(不执行代码)。通过向你投射obj这些知识。添加运行时类型 ( typeof) 没有帮助。即使您可以使用返回元组的第二个值,这有什么帮助?您的程序代码将被硬编码为true|false您拥有的任何值。

如果在编译时不知道这个值(例如从控制台读取),你会假设什么类型?t下面的绑定应该是什么?

let o : t = test someBool someInt

可以是ZeroFour, 即Zero | Four, 即type Either = Zero | Four, 即

type EitherEnum =
| Z of Zero
| F of Four

... 一个受歧视的工会,正如你已经知道的那样。

基本上,我想要做的是能够返回这些不同的枚举,而无需将零和四包装到 DU 中。

您已经想出了如何做到这一点:强制转换obj和松散类型安全。你不能两全其美。

您正在寻找的是依赖类型,例如F*提供的东西。

于 2017-02-18T09:33:32.827 回答