由于DateTime是一个结构体,其成员似乎可以分解为简单的数学值,因此我不确定为什么在其上使用sizeof()会产生问题标题中的消息。
因为CLR只能在运行时确定大小…其中一个原因是"填充"(依赖于平台)…
对于所有其他类型,包括结构体,sizeof操作符可以为仅在不安全代码块中使用。虽然你可以用元帅。SizeOf方法,此方法返回的值并不总是与sizeof返回的值相同。元帅。SizeOf返回类型被封送后返回Size,而sizeof返回由公共语言运行时分配的大小,包括任何padding
Ref .
参见如何检查结构所消耗的字节数?
您得到的完整错误文本是:
错误CS0233: 'System. '因此,DateTime'没有预定义的大小Sizeof只能在不安全的上下文中使用(考虑使用System.Runtime.InteropServices.Marshal.SizeOf)
所以如果你使用unsafe
上下文(一定要去c#项目的"属性","构建"选项卡,并在"允许不安全代码"中设置一个复选标记,使下面的编译)它工作得很好:
static void Main()
{
int s;
unsafe
{
s = sizeof(DateTime);
}
Console.WriteLine(s); // writes 8
}
使用unsafe
关键字,sizeof()
将与所有enum
类型和所有没有引用类型实例字段的struct
类型一起工作(DateTime
是一个没有引用类型成员的结构体,可以肯定)。
没有unsafe
关键字,不能使用sizeof
。(但是,从c# 2开始,您可以在预定义类型(如int
和enum
类型)上使用它,但不能在其他结构(如DateTime
)上使用它,如您所见。)
注意DateTime
结构体是异常的,因为Marshal.SizeOf<DateTime>()
(或。net 4.5.1(2013)之前的Marshal.SizeOf(typeof(DateTime))
)会抛出异常。这是因为不寻常的(对于struct
)结构布局"Auto"。
Alex Pinsker为获取DateTime
(或任何其他类型)的大小编写了很好的解决方案。