C# sizeof()结构未知。为什么?

C# sizeof()结构未知。为什么?,c#,struct,sizeof,C#,Struct,Sizeof,为什么我不能在简单结构上使用sizeof() 例如: 错误CS0233:“FloatShortPair”没有预定义的大小,因此sizeof只能在不安全的上下文中使用(请考虑使用System.Runtime.InteropServices.Marshal.sizeof) 国家: sizeof运算符只能用于编译时类型 常数。如果出现此错误,请确保 标识符可以在编译时确定。如果不能,那么 使用SizeOf而不是SizeOf 浮点和短非编译时常量是如何定义的?8-/short和float的大小是恒定的-

为什么我不能在简单结构上使用sizeof()

例如:

错误CS0233:“FloatShortPair”没有预定义的大小,因此sizeof只能在不安全的上下文中使用(请考虑使用System.Runtime.InteropServices.Marshal.sizeof)

国家:

sizeof运算符只能用于编译时类型 常数。如果出现此错误,请确保 标识符可以在编译时确定。如果不能,那么 使用SizeOf而不是SizeOf


浮点和短非编译时常量是如何定义的?8-/

short和
float
的大小是恒定的-但是CLR决定如何将该float打包到内存中并不一定是恒定的。例如,在64位处理器上,它可能决定在8字节边界上对齐每个值

根据C#4规范第18.5.8节:

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

[……]

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

[……]

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


请注意,在这种情况下,您可以在
不安全的
上下文中使用
sizeof
。您是应该使用它还是
Marshal.SizeOf
取决于您尝试执行的操作。

如错误消息所示,请使用System.Runtime.InteropServices.Marshal.SizeOf.Related问题(很抱歉劫持):如果您对类型的布局有更好的控制(StructLayoutAttribute带有显式偏移量)这是否使其成为编译时常量?@MattDavey:不符合规范。基本上,C语言规范试图不涉及StructLayoutAttribute之类的实现细节。如果要针对创建许多中等大小列表的场景优化
IList
实现,请简单使用,而放弃,保持所有阵列足够小以避免LOH分配将是一个重大胜利。如果一个类无法确定.NET对每个元素所需的实际空间量,那么它应该通过什么方式选择最大内部数组大小?我知道,决定LOH上应该包含哪些对象的过程可能会发生变化,但将数组保持在85000字节以下至少可以提高当前版本的.NET的性能;即使其他一些策略在未来的.NET中可能会更好,将分配保持在85000字节以下的代码至少应该继续正常工作。但要使代码在今天的.NET中保持分配在85000字节以下,就必须知道它们在今天的.NET中的大小。
private struct FloatShortPair
{
    public float myFloat;
    public short myShort;
};

int size = sizeof(FloatShortPair);  //CS0233