所以我有这段代码:
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
...
这在最后一行抱怨没有定义。
基本上我要做的就是能够返回这些不同的枚举,而不需要将Zero和Four包装成DU。
答案 0 :(得分:2)
你不能这样做,&#34;输入安全&#34;暗示您(编译器)知道类型静态(不执行代码)。通过施放到obj
,你就会失去知识。添加运行时类型(typeof
)没有帮助。即使你可以使用返回的元组的第二个值,它会有什么帮助?对于您拥有的true|false
值,您的程序代码将被硬编码。
如果在编译时不知道这个值(例如从控制台读取),你会假设什么类型? t
在以下绑定中应该是什么?
let o : t = test someBool someInt
可以是Zero
或Four
,即Zero | Four
,即type Either = Zero | Four
,即
type EitherEnum =
| Z of Zero
| F of Four
......一个受歧视的工会,正如你已经想到的那样。
基本上我要做的就是能够返回这些不同的枚举,而不需要将Zero和Four包装成DU。
你已经想出了如何做到这一点:施放到obj
并且松散类型安全。你无法双管齐下。
您正在寻找的是dependent types,例如F*提供。