首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

c# 泛型支持指针吗解决方案

2012-06-07 
c# 泛型支持指针吗以下函数编译出错,可以解决吗?public int TestT(T t) where T:struct{// 我要计算结构

c# 泛型支持指针吗
以下函数编译出错,可以解决吗?

public int Test<T>(T t) where T:struct
{
// 我要计算结构的大小
  int size = sizeof(T); // 《-错误
  byte [] buf = new byte[size];

// 我要用T的指针
  T* p = &t; // 《-错误
  return size;
}
错误1无法获取托管类型(“T”)的地址和大小,或无法声明指向它的指针

如果不能用泛型,我那几十个结构就麻烦了。。。

[解决办法]
要用指针必须加unsafe标签
[解决办法]
int size = System.Runtime.InteropServices.Marshal.SizeOf(typeof(T));
[解决办法]
用引用就好了,意义和指针类似,但是不同,尽量不要用UNSAFE了。
[解决办法]
错误struct没有预定义的大小,因此 sizeof 只能在不安全的上下文中使用
C#没有指针这个类型
lz以前是写c++的吧
[解决办法]
使用Unsafe关键字 可以标识出类 方法 代码段等 用非托管指针去进行操作 sizeof可以
Marshal.SizeOf(Type t);

[解决办法]

C# code
// 编译: csc.exe /unsafe Program.csusing System;using System.Runtime.InteropServices; class Program{   public unsafe int Test<T>(T t) where T:struct   {     // 我要计算结构的大小     int size = Marshal.SizeOf(typeof(T)); // <-- 可以     byte[] buf = new byte[size];     // 我要用T的指针     T* p = &t;                            // <-- 错误     return size;   } }
[解决办法]
指针必须unsafe声明
[解决办法]
即使与 unsafe 关键字一起使用时,也不允许获取托管对象的地址或大小或者声明指向托管类型的指针。
[解决办法]
探讨
即使与 unsafe 关键字一起使用时,也不允许获取托管对象的地址或大小或者声明指向托管类型的指针。

[解决办法]
C# code
// 编译: csc.exe /unsafe Program.csusing System;using System.Runtime.InteropServices; struct Struct001{  int  i;  long j;  char k;}struct Struct002{  int i;  string s;  // <-- 因为 string 是托管类型,所以无法获得 Struct002 的指针}class Program{   public unsafe int Test<T>(T t) where T:struct   {     // 我要计算结构的大小     int size = Marshal.SizeOf(typeof(T)); // <-- 可以     byte[] buf = new byte[size];     // 可以获取非托管类型或由非托管类型构成的结构的指针    Struct001  t1;    Struct001* p1 = &t1;                  // <-- 可以    // 不能获取托管类型或由托管类型构成的结构的指针    Struct002  t2;    Struct002* p2 = &t2;                  // <-- 错误 CS0208        // 因为T未知,不知其成员是否含有托管类型,所以无法获得其指针     T* p = &t;                            // <-- 错误 CS0208     return size;   } }
[解决办法]
下列类型都可以是指针类型:

sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal 或 bool。

任何枚举类型。

任何指针类型。

仅包含非托管类型的字段的任何用户定义的结构类型。


[解决办法]
噢。
[解决办法]
上边说的已经很明白了.
[解决办法]
OK
[解决办法]
Marshal.SizeOf(typeof(T));
这个就可以了,要想让net去接管指针,则必须先转到非托管对象上
[解决办法]
学习学习...
------解决方案--------------------


up
[解决办法]
也可以考虑这个方法:
你的目的:得到T的尺寸,已其大小得buffer;

将T指为一个接口:
interface ISize
{
int GetSize();
//其它的一样
}
每个struct实现这个,然后,
public int Test <T>(T t) where T:ISize

int size = t.GetSize(); 
byte [] buf = new byte[size]; 
......

大概是这个意思。我觉得这虽然麻烦些,但比unsafe安全一些,当然了每个人的方法思路不一样,这里当做参考吧!

热点排行