Generics 使用泛型类型参数的函数中使用的函数返回类型

Generics 使用泛型类型参数的函数中使用的函数返回类型,generics,f#,first-class,Generics,F#,First Class,所以我有这个代码: 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 = en

所以我有这个代码:

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)
     ...
我在想,有没有什么方法可以恢复类型安全性

也许是这样的

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>
这在最后一行投诉,但未定义t

基本上,我想做的是能够返回这些不同的枚举,而不必将0和4包装到DU中。

你不能这样做,“类型安全”意味着你(编译器)静态地知道类型(不执行代码)。通过施放到
obj
你失去了知识。添加运行时类型(
typeof
)没有帮助。即使可以使用返回的元组的第二个值,这又有什么帮助呢?您的程序代码将根据您拥有的
true | false
值进行硬编码

如果编译时不知道该值(例如,从控制台读取),您将采用什么类型?在以下绑定中,
t
应该是什么

let o : t = test someBool someInt
它可以是
Zero
Four
,即
Zero | Four
,即
类型或=Zero | Four
,即

type EitherEnum =
| Z of Zero
| F of Four
。。。一个受歧视的联盟,正如你已经发现的

基本上,我想做的是能够返回这些不同的枚举,而不必将0和4包装到DU中

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


您要查找的是,例如提供的内容。

类型参数必须是静态已知的,它们不能是动态计算的结果。
类型
实例在运行时存在
enum
需要一个编译时参数。
let o : t = test someBool someInt
type EitherEnum =
| Z of Zero
| F of Four