我想创建一个泛型方法,该方法使用指向T数组的指针,其中T可以是C#原语,也可以是C#类。我一直很顺利,直到我尝试了“T”部分。
是否有解决错误的方法“无法声明指向非非托管类型的指针TIn”
我尝试通过“fixed”关键字使用固定来实现这一目标。
public static object DoSomething<TIn, TOut>(object SObj, Action<TIn, TOut> takeAction)
{
double[]A = (double[]) SObj;
TIn[]B = new TIn[5];
unsafe
{
fixed (double* dbl = A) // <--- works okay
{
}
fixed (TIn* Sptr = B) // <--- fails
{
}
}
}
-
@dtb:刚检查出blittable。 “blittable类型的一维数组,例如整数数组。但是,包含blittable类型的可变数组的类型本身并不是blittable。”即使存在可以约束的约束,看起来它们也只限于一维数组。
答案 0 :(得分:6)
基本上,没有。您无法创建指向托管类型的指针 - 仅限于某些基本类型和结构,其中所有字段本身都是结构或非托管类型。您的通用参数类型将不具有这些属性,因此它禁止构造指针并为您提供该错误。
根据http://msdn.microsoft.com/en-us/library/y31yhkeb.aspx,指针可以指向:
sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double,decimal或bool。
任何枚举类型。
任何指针类型。
任何用户定义的结构类型,仅包含非托管类型的字段。
幸运的是,由于指针算法是不可能的,因此指向托管类型的指针并没有多大好处。你为什么要建一个?