我想创建一个泛型方法,该方法使用指向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
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
-
@dtb:刚检查出blittable."blittable类型的一维数组,例如整数数组.但是,包含blittable类型的可变数组的类型本身并不是blittable." 即使存在可以约束的约束,似乎它们也将它限制为一维的数组.
基本上没有.您无法创建指向托管类型的指针 - 仅限于某些基本类型和结构,其中所有字段本身都是结构或非托管类型.您的泛型参数类型将不具有这些属性,因此它禁止构造指针并为您提供该错误.
根据http://msdn.microsoft.com/en-us/library/y31yhkeb.aspx,可以指向:
sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double,decimal或bool.
任何枚举类型.
任何指针类型.
任何用户定义的结构类型,仅包含非托管类型的字段.
幸运的是,由于指针算法是不可能的,因此指向托管类型的指针并没有多大好处.你为什么要建一个?