sizeof()结构未知.为什么?
本文关键字:为什么 未知 结构 sizeof | 更新日期: 2023-09-27 18:13:42
为什么我不能在简单结构上使用sizeof((?
例如:
private struct FloatShortPair
{
public float myFloat;
public short myShort;
};
int size = sizeof(FloatShortPair); //CS0233
错误CS0233:"FloatShortPair"没有预定义的大小,因此sizeof只能在不安全的上下文中使用(请考虑使用System.Runtime.InteropServices.Marshal.sizeof(
MSDN状态:
sizeof运算符只能用于编译时的类型常数。如果出现此错误,请确保标识符可以在编译时确定。如果不能,那么请使用SizeOf而不是SizeOf。
float和short是如何不编译时间常数的?8-/
short
和float
的大小是恒定的,但CLR决定如何在内存中封装浮点值并不一定是恒定的。例如,在64位处理器上,它可以决定在8字节边界上对齐每个值。
根据C#4规范,第18.5.8节:
对于某些预定义类型,
sizeof
运算符会产生一个常数值,如下表所示。[…]
对于所有其他类型,
sizeof
运算符的结果是实现定义的,并被分类为值,而不是常量。[…]
出于对齐的目的,在结构的开头、结构内和结构的末尾可能都有未命名的填充。
请注意,在这种情况下,可以在unsafe
上下文中使用sizeof
。你应该使用它还是Marshal.SizeOf
取决于你想要做什么。