let inline set (x: ^t) = BitConverter.ToUInt32(BitConverter.GetBytes(x),0)我尝试过类似上面的方法,但它不起作用。也不需要类型约束或运行时解析类型。另外,我猜答案是否定的,但有没有可能告诉编译器泛型类型仅仅是float32或float?这会省去我很多麻烦。
编辑:
令我惊讶的是,Tomas Petricek写的东西是有效的,而反之亦然:
let inline toUint32 conv x =
let bytes = conv x
BitConverter.ToUInt32(bytes, 0)
toUint32 BitConverter.GetBytes 9999.99f
toUint32 BitConverter.GetBytes 9999.99 这很有趣。另外一个帖子中没有conv : BitConvertible,我也不能让它工作。
发布于 2015-12-19 22:17:39
静态成员约束不能直接让您编写调用重载方法的内联函数。编译器无法决定是否对函数进行类型检查,就好像参数是float、float32或任何其他受支持的类型一样。
简单的解决方案是将转换函数作为单独的参数传递:
let inline toUint32 x conv =
let bytes = conv x
BitConverter.ToUInt32(bytes, 0)
toUint32 9999.99f BitConverter.GetBytes
toUint32 9999.99 BitConverter.GetBytes 这需要更多的输入,但很容易看到发生了什么。调用者只需要提供一个执行转换的函数--在典型情况下,它可以是BitConverter.GetBytes。
另一种方法(已经在另一个答案中讨论过)是使用一个稍微有点老套的技巧,允许您指定更多花哨的静态约束;这样就不需要传递显式函数,只要它对最终用户隐藏,就可以使代码更短。
发布于 2015-12-19 22:15:30
如果你准备做一些不寻常的事情,你可以使用静态解析的类型约束来泛化这个函数。
请注意,这在其他.NET语言中是行不通的--静态解析的类型约束完全是F#编译器的一个特性。
type BitConvertible =
|BitConvertible
static member Convert (conv : BitConvertible, flt : float) =
System.BitConverter.GetBytes(flt)
static member Convert (conv : BitConvertible, flt32 : float32) =
System.BitConverter.GetBytes(flt32)
module BitConverter =
let inline convertToBytes x =
((^T or ^U) : (static member Convert : ^T * ^U -> byte[]) (BitConvertible, x))然后你就可以使用它了..。
let a = BitConverter.convertToBytes 16.0
let b = BitConverter.convertToBytes 27.0fhttps://stackoverflow.com/questions/34369883
复制相似问题