gpt4 book ai didi

c# - 为什么不允许指向泛型类型的指针?

转载 作者:太空狗 更新时间:2023-10-30 01:30:48 26 4
gpt4 key购买 nike

例如,作为重载的[] 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 在运行时只会是 float、double、int 或 byte,但我不知道如何将其告诉编译器以便它信任我。

为什么不能用,反正都是指针,一不小心什么类型的数组都能溢出

我怎样才能做到这一点(用类似的方式或其他方式)而不比慢得多:

    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 类型的一个代码)我想接口(interface)在这里无济于事。

最佳答案

C# restricts指向

的指针类型
  • sbyte, byte, short, ushort, int, >uintlongulongcharfloatdouble >,十进制,或 bool
  • 任何枚举类型,
  • 任何指针类型,
  • 任何用户定义的 struct 类型,仅包含非托管类型的字段。

最后一点很关键,因为编译器必须能够验证您尝试创建指针的 struct 是否“合法”。否则,您将能够传递 T,它是一个 struct,其字段引用托管类型(例如,一个 string),这是被禁止的。

既然您有兴趣为四种数据类型提供这种行为,您应该能够通过提供四种重载来解决这个问题:

public int GetInt(int i) {
unsafe {
var p = (int*)hArr.ToPointer();
return *(p + i);
}
public void SetInt(int i, int val) {
unsafe {
var p = (int*)hArr.ToPointer();
*(p + i) = val;
}
}
public float GetFloat(int i) {
unsafe {
var p = (int*)hArr.ToPointer();
return *(p + i);
}
public void SetFloat(int i, float val) {
unsafe {
var p = (float*)hArr.ToPointer();
*(p + i) = val;
}
}
... // and so on

运行时效率将保持不变,假设编译器有足够的信息在编译时解决重载问题。

关于c# - 为什么不允许指向泛型类型的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42940040/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com