[英]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,那么您可以保持类型安全,所以如果可能的话,它可能是更好的选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.