0
A
回答
5
let getStaticType<'T>(_x : 'T) = typeof<'T>
let a : string = null
let b : int[] = null
let typ1 = getStaticType a
let typ2 = getStaticType b
printfn "%A %A" typ1 typ2
// System.String System.Int32[]
1
我不知道这是最好的答案,但你可以用引文检索与类型。
例如:
let get_type x = <@ x @>.Type.FullName
和测试:
let a : string = null
let a' = get_type a
val a : string = null
val a' : string = "System.String"
let a : int[] = null
let a' = get_type a
val a : int [] = null
val a' : string = "System.Int32[]"
4
布赖恩的解决方案可能做你需要什么,但你不应该需要在实践中。
运行时类型 -如果你真的需要(使用GetType
),那么这可能是因为该类型可能比静态类型表明更具体的(即它是反序列检测值在运行时的类型或使用Reflection创建并获得类型obj
或某个接口的值)。在这种情况下,你需要处理null
明确,因为getStaticType
总会给你obj
:
let handleAtRuntime (value:obj) =
match value with
| null -> // handle null
| _ -> let typ = value.GetType()
// do something using runtime-type information
静态类型 -如果你只需要知道一个静态已知类型的System.Type
,那么你应该能够使用typeof<_>
来编写所有你需要的东西。
let handleStatically (value:'T) =
let typ = typeof<'T>
// do something with the type (value still may be null)
在你的榜样,你真的不需要任何动态的行为,因为你可以肯定的是,值的类型为string
,所以你可以使用Brian的解决方案:当你有泛型函数,这非常有用,但使用typeof<string>
也可以。
相关问题
- 1. F#如何处理可空类型
- 2. 与F#类型使用CLR接口
- 3. 在类型使用F#索引属性
- 4. 使用c#,当我有一个对象类型的变量时,如何利用使用空值的值类型?
- 5. F#类型推断
- 6. F#多态类型
- 7. F#类型约束
- 8. F#类型信息
- 9. F#与泛型类型的问题
- 10. f#泛型类型比较
- 11. 可为空的值类型只是包装常规值类型?
- 12. 是F#引用类型中的选项类型?
- 13. 非可空字符串的F#类型别名
- 14. 使用F的类型成员中的元组#
- 15. 是可空类型的引用类型?
- 16. 可空的复杂类型的值
- 17. F-Sharp(F#)无类型无限
- 18. 使用F#类型提供实例类型,并提供它们的属性
- 19. F# - 类型扩充VS类型扩展
- 20. 使用java.util.Optional为可选类型的子字段返回空值
- 21. F#sqlProvider的SQLite的忽略列类型
- 22. F#的递归类型的SQL表
- 23. bytea类型和空值,Postgres
- 24. DataRow ArrayItem的空值数据类型vb.net
- 25. 如何修改可空类型的值?
- 26. F#:使用DU限制类型的物业
- 27. 如何使用动态类型而不是F#中的Object?
- 28. TypeScript使用相同类型的全局类型名称空间
- 29. MySQL的数据类型,以空值“0”,和非空值“1”
- 30. F#如何通过匹配语句确定值的类型?
我不知道这是否是有效的F#,但它看起来足够接近我期待看到的+1 +1 lol –
不错。您也可以删除输入值,而不是将其绑定到_x。 'let getStaticType(_:'T)= typeof <'T>'。 – cfern
谢谢。这就是我需要的! –