这有什么问题?
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)才能很容易地适应。
答案 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关键字一起使用,也不允许获取托管对象的地址,获取托管对象的大小或声明指向托管类型的指针。托管类型为:
任何参考类型
- 醇>
任何包含引用类型作为字段或属性的结构
您唯一的选择是使用Marshal.SizeOf
。