有没有办法在 F# 中将 0 表示为空指针

Is there a way to represent 0 as a void pointer in F#

在 OpenGL 中,通常调用 gl.TexImage2D 需要一个 void* 作为最终数据参数。稍后可以传递数据,因此最后一个参数也可以设置为 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
  )

类型voidptrSystem.Void*的别名,但是.NET编译器不喜欢我们直接使用这个类型。所以提供了 IntPtr.ToPointer() 来将任何指针转换为 void 指针。在你的例子中,你想要转换一个空指针(即 0n),所以你可以使用

IntPtr.Zero.ToPointer()

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