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-/

sizeof()结构未知.为什么?

shortfloat的大小是恒定的,但CLR决定如何在内存中封装浮点值并不一定是恒定的。例如,在64位处理器上,它可以决定在8字节边界上对齐每个值。

根据C#4规范,第18.5.8节:

对于某些预定义类型,sizeof运算符会产生一个常数值,如下表所示。

[…]

对于所有其他类型,sizeof运算符的结果是实现定义的,并被分类为值,而不是常量。

[…]

出于对齐的目的,在结构的开头、结构内和结构的末尾可能都有未命名的填充。

请注意,在这种情况下,可以unsafe上下文中使用sizeof。你应该使用它还是Marshal.SizeOf取决于你想要做什么。