【发布时间】:2017-03-21 23:22:41
【问题描述】:
例如作为重载的[]setter-getter,
public T this[int i]
{
get
{
unsafe
{
T* p = (T*)hArr.ToPointer(); // hArr is a C++ object pointer(IntPtr)
return *(p + i);
}
}
set
{
unsafe
{
T* p = (T*)hArr.ToPointer();
*(p + i) = value;
}
}
}
并且编译器抱怨(下划线)它“无法将...的地址”转换为托管类型T。
我知道T 在运行时只会是浮点、双精度、整数或字节,但我不知道如何告诉编译器,所以它信任我。
为什么我不能用,反正都是指针,一不小心我可以溢出任何类型的数组。
我怎样才能做到这一点(用类似的方式或其他方式)而不比:
public float this[int i]
{
get
{
unsafe
{
float* p = (float*)hArr.ToPointer();
return *(p + i);
}
}
set {
unsafe
{
float* p = (float*)hArr.ToPointer();
*(p + i) = value;
}
}
}
我不仅关心这里的性能,还关心代码的简单性。 (所有 T 类型的一个代码)我想接口在这里无济于事。
【问题讨论】:
-
不能使用引用类型的
&运算符(不包括string类型)来获取指针...值类型(struct)可以包含引用类型,所以一般来说你不能做T的&(因为即使将T限制为值类型,拥有指向它的指针仍然可能是“非法的”) -
@xanatos 我也不能继承浮点数或整数。这是否意味着,我必须在代码重复 + 性能与简单性 + not_performance 之间做出选择?
-
@huseyn 可能如你所说。也许您可以直接用 IL 代码编写它,并拥有一个仅由 IL 代码组成的程序集......已经有一个像这样完成的库
-
@xanatos 有 aparapi 和 cudafy 相似,但我正在为非常简单的事情编写一个非常简单的库。
-
我说的是:用 IL 语言编写的库 github.com/dotnet/corefx/tree/master/src/…