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

F# 有没有办法在F中将0表示为空指针,f#,interop,F#,Interop,在OpenGL中,调用gl.TexImage2D通常需要一个void*作为最终数据参数。可以稍后传递数据,因此最后一个参数也可以设置为0。在F中,我还没有找到一种将0转换为voidptr的干净方法 以下方法对我有效,但是否有更清洁的解决方案 let emptyData: array<byte> = [||] use emptyPtr = fixed emptyData let voidPtr = emptyPtr |> NativePtr.toVoidPtr g

在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
  )

voidptr类型是System.Void*的别名,但.NET编译器不希望我们直接使用此类型。因此,IntPtr.ToPointer用于将任何指针转换为空指针。在本例中,您希望转换一个空指针,即0n,以便可以使用

IntPtr.Zero.ToPointer()
您还可以使用0n.ToPointer,正如另一位评论员指出的那样,Unchecked.defaultof也可以工作,因为编译器可以推断您在这里需要什么。IntPtr.Zero.ToPointer是最可读的,依我看。

类型voidptr是System.Void*的别名,但.NET编译器不希望我们直接使用这种类型。因此,IntPtr.ToPointer用于将任何指针转换为空指针。在本例中,您希望转换一个空指针,即0n,以便可以使用

IntPtr.Zero.ToPointer()

您还可以使用0n.ToPointer,正如另一位评论员指出的那样,Unchecked.defaultof也可以工作,因为编译器可以推断您在这里需要什么。IntPtr.Zero.ToPointer是最可读的,依我看。

最后一个参数请尝试0n。@JimFoye这是一个nativent。我需要一个空的PTR。0n在这种情况下不起作用。它对我起作用,我使用OpenGL.Net设置了一个示例项目。您看到的错误是什么?我正在使用Silk.NET OpenGL库,所以它可能没有过载。最后一个参数请尝试IntPtr.Zero.ToPointer.Try 0n。@JimFoye这是一个nativeint。我需要一个空的PTR。0n在这种情况下不起作用。它对我起作用,我使用OpenGL.Net设置了一个示例项目。您看到的错误是什么?我使用的是Silk.NET OpenGL库,因此它可能没有过载。请尝试IntPtr.Zero.ToPointer.Awesome答案!非常感谢,吉姆。@PhilT不客气。老实说,每次我必须处理.NET中的指针时,我都必须重新阅读文档。有趣的是,我以前做C++,对指针很舒服。事实上,在.NETIMHO中,它们更难使用。答案太棒了!非常感谢,吉姆。@PhilT不客气。老实说,每次我必须处理.NET中的指针时,我都必须重新阅读文档。有趣的是,我以前做C++,对指针很舒服。在.NET IMHO中,它们实际上更难使用。