首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何调用Bitconverter.Getbytes generic?

如何调用Bitconverter.Getbytes generic?
EN

Stack Overflow用户
提问于 2015-12-19 18:55:19
回答 2查看 262关注 0票数 0
代码语言:javascript
复制
let inline set (x: ^t) = BitConverter.ToUInt32(BitConverter.GetBytes(x),0)

我尝试过类似上面的方法,但它不起作用。也不需要类型约束或运行时解析类型。另外,我猜答案是否定的,但有没有可能告诉编译器泛型类型仅仅是float32或float?这会省去我很多麻烦。

编辑:

令我惊讶的是,Tomas Petricek写的东西是有效的,而反之亦然:

代码语言:javascript
复制
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,我也不能让它工作。

EN

回答 2

Stack Overflow用户

发布于 2015-12-19 22:17:39

静态成员约束不能直接让您编写调用重载方法的内联函数。编译器无法决定是否对函数进行类型检查,就好像参数是floatfloat32或任何其他受支持的类型一样。

简单的解决方案是将转换函数作为单独的参数传递:

代码语言:javascript
复制
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

另一种方法(已经在另一个答案中讨论过)是使用一个稍微有点老套的技巧,允许您指定更多花哨的静态约束;这样就不需要传递显式函数,只要它对最终用户隐藏,就可以使代码更短。

票数 3
EN

Stack Overflow用户

发布于 2015-12-19 22:15:30

如果你准备做一些不寻常的事情,你可以使用静态解析的类型约束来泛化这个函数。

请注意,这在其他.NET语言中是行不通的--静态解析的类型约束完全是F#编译器的一个特性。

代码语言:javascript
复制
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))

然后你就可以使用它了..。

代码语言:javascript
复制
let a = BitConverter.convertToBytes 16.0
let b = BitConverter.convertToBytes 27.0f
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34369883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档