【发布时间】:2013-07-22 21:58:42
【问题描述】:
我被一项看似微不足道的任务困住了,需要你的帮助。
我需要编写一个带有以下签名的方法:
System.Array ToIntPtrArray(System.Array a)
其中实际参数可以是任何pointer type 的数组(例如int*[]、long**[]、void*[,])并返回一个形状相同的数组,其中System.IntPtr 类型的元素具有相同的数值作为输入数组的元素。问题是如果我事先不知道指针的类型,我不明白如何提取指针的数值。
例如,如果我事先知道我的参数总是void*[] 类型,我可以编写如下方法:
unsafe IntPtr[] ToIntPtrArray(void*[] a)
{
var result = new IntPtr[a.Length];
for (int i = 0; i < a.Length; i++)
result[i] = (IntPtr) a[i];
return result;
}
但问题是它可能不是void*[],而是void**[]或其他任何东西,并且该方法应该能够处理所有情况。
【问题讨论】:
-
void*的数值是多少? -
@CédricBignon 我不太明白你的问题。
void*类型的变量可以具有与平台相关的地址范围内的任何数值,并且无论如何它都适合该平台上的IntPtr。我添加了一个示例,说明它在这种情况下应该如何工作。 -
@TheJoker 是的,如果我在编译时知道指针的确切类型,我会使用显式转换。但我不知道,你建议使用什么转换?您期望什么样的未定义行为?
-
@nicholas 该方法应该能够处理 .NET 运行时中可能存在的所有类型的指针。我不知道可能的调用者可能会选择作为参数传递。我可以使用一组重载,只要它们覆盖所有可能的输入。
-
需要注意的事情(来自 MSDN 文档(:“不支持在本机代码中使用指针数组对象,并且会为多种方法抛出 NotSupportedException。”GetValue 就是这样一种方法。
标签: c# .net arrays pointers intptr