繁体   English   中英

f#将obj转换为FSharpValue.MakeTuple中的元组类型

[英]f# cast obj to tuple type from FSharpValue.MakeTuple

我有一个obj ,实际上是一个元组DateTime*int*decimal*decimal ,它是一个obj ,因为我通过使用创建tuple

let tupleType = typeof<(DateTime*int*decimal*decimal)>
let ret = FSharpValue.MakeTuple(x, tupleType)

现在我想把ret转回DateTime*int*decimal*decimal ,我做了,

 ret :?> DateTime*int*decimal*decimal

我的问题是我可以使用tupleType进行转换而不是像上面的代码那样明确指定类型吗?

简短的回答是否定的

在编译时已经进行了转换和类型检查。 它被称为静态类型,因为类型独立于运行时(动态)值。 代码未运行时(即静态 ),这些类型已经可用。

在编译时, ret具有静态类型obj ,而在运行时它具有DateTime*int*decimal*decimal

但是,除非你告诉它,否则编译器不会知道这一点。

同样, tupleType在编译时和运行时都具有Type 但它的DateTime*int*decimal*decimal 该信息仅在运行时提供。

如果你想让ret具有类型DateTime*int*decimal*decimal ,你需要告诉编译器这是类型。 在编译时, tupleType不提供该信息。

如果您可以设计系统以便不需要使用Reflection,那么您可以保持类型安全,所以如果可能的话,它可能是更好的选择。

正如马克在答案中解释的那样,你不能按照预期的方式去做。 但是,您可以使用类型缩写

open System
open Microsoft.FSharp.Reflection

type MyTuple = DateTime*int*decimal*decimal

let ret = FSharpValue.MakeTuple([|DateTime.Now;1;1.0M;1.0M|],typeof<MyTuple>)
let myTuple = ret :?> MyTuple

获取myTuple类型的MyTuple ,后者在编译时携带有关元组成员的类型信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM