如何查找模板类型的大小

时间:2016-12-11 01:13:39

标签: c# templates sizeof

这有什么问题?

int SizeOf<T> (T [] fred) { return fred.Length * sizeof(T); }

它无法编译。

我的目的是编写一个例程来将整数,字节或双精度数组写入二进制文件。像

这样的东西

//写入数组T []数据

void WriteToFile<T> (Filestream f, T[] data)
{
    int bufferSize = data.Length * sizeof(T);
    byte[] workBuffer = new byte[bufferSize];
    System.Buffer.BlockCopy(data, 0, workBuffer, 0, bufferSize);
    f.Write(workBuffer, 0, bufferSize);
}

有没有办法对此进行模板处理,以便它也能用于2D数组(尽管只有sizeof(T)才能很容易地适应。

1 个答案:

答案 0 :(得分:1)

你得到的错误是:

  

&#39; T&#39;没有预定义的大小,因此sizeof只能在不安全的上下文中使用(考虑使用System.Runtime.InteropServices.Marshal.SizeOf)

documentation on the sizeof operator讨论了这个问题:

  

对于所有其他类型(包括结构),sizeof运算符只能用于不安全的代码块。虽然您可以使用Marshal.SizeOf方法,但此方法返回的值并不总是与sizeof返回的值相同。 Marshal.SizeOf在封送类型后返回大小,而sizeof返回公共语言运行时分配的大小,包括任何填充。

但你也cannot use sizeof with any managed type

  

即使与unsafe关键字一起使用,也不允许获取托管对象的地址,获取托管对象的大小或声明指向托管类型的指针。托管类型为:

     
      
  1. 任何参考类型

  2.   
  3. 任何包含引用类型作为字段或属性的结构

  4.   

您唯一的选择是使用Marshal.SizeOf