有没有办法在 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
)
类型voidptr
是System.Void*
的别名,但是.NET编译器不喜欢我们直接使用这个类型。所以提供了 IntPtr.ToPointer()
来将任何指针转换为 void 指针。在你的例子中,你想要转换一个空指针(即 0n
),所以你可以使用
IntPtr.Zero.ToPointer()
您也可以使用 0n.ToPointer()
,正如其他评论者指出的那样,Unchecked.defaultof<_>
也可以,因为编译器可以推断出您在这里需要什么。 (IntPtr.Zero.ToPointer()
是最易读的,IMO)。
在 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()
来将任何指针转换为 void 指针。在你的例子中,你想要转换一个空指针(即 0n
),所以你可以使用
IntPtr.Zero.ToPointer()
您也可以使用 0n.ToPointer()
,正如其他评论者指出的那样,Unchecked.defaultof<_>
也可以,因为编译器可以推断出您在这里需要什么。 (IntPtr.Zero.ToPointer()
是最易读的,IMO)。