首页 > 解决方案 > 有没有办法在 F# 中将 0 表示为 void 指针

问题描述

在 OpenGL 中,通常调用gl.TexImage2D需要 avoid*作为最终数据参数。可以稍后传递数据,因此最后一个参数也可以设置为0. 在 F# 中,我还没有找到一种干净的方式来0转换为voidptr.

以下对我有用,但有更清洁的解决方案吗?

  let emptyData: array<byte> = [||]
  use emptyPtr = fixed emptyData
  let voidPtr = emptyPtr |> NativePtr.toVoidPtr
  gl.TexImage2D(
    GLEnum.Texture2D,
    0,
    int GLEnum.Red,
    atlasWidth,
    atlasHeight,
    0,
    GLEnum.Red,
    GLEnum.UnsignedByte,
    voidPtr
  )

标签: f#interop

解决方案


该类型voidptr是 .NET 的别名System.Void*,但 .NET 编译器不希望我们直接使用该类型。所以IntPtr.ToPointer()提供了将任何指针转换为 void 指针。在你的情况下,你想转换一个空指针(即,0n),所以你可以使用

IntPtr.Zero.ToPointer()

您也可以使用0n.ToPointer(),正如其他评论者指出的那样,它Unchecked.defaultof<_>也可以使用,因为编译器可以在这里推断出您需要什么。(IntPtr.Zero.ToPointer()是最易读的,IMO)。


推荐阅读