由于DateTime是一个结构,其成员似乎分解为简单的数学值,我不确定为什么在其上使用sizeof()会在问题标题中生成消息。
答案 0 :(得分:7)
因为CLR只能在运行时确定大小...其中一个原因是“填充”(取决于平台)......
对于所有其他类型,包括结构,sizeof运算符都可以 仅用于不安全的代码块。虽然你可以使用 Marshal.SizeOf方法,此方法返回的值并不总是如此 与sizeof返回的值相同。 Marshal.SizeOf返回 类型被封送后的大小,而sizeof返回 size ,因为它已由公共语言运行库分配, 包括任何填充。
另见How do I check the number of bytes consumed by a structure?
答案 1 :(得分:1)
您获得的完整错误文本是:
错误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
类型,这些类型不具有引用类型的实例字段(以及{{1是一个没有引用类型成员的结构,当然)。
如果没有DateTime
关键字,则无法使用unsafe
。 (但是,由于C#2允许您在sizeof
和int
类型等预定义类型上使用它,但在enum
之类的其他结构上不允许使用它,如您所见。)< / p>
请注意,DateTime
结构是例外的,DateTime
(或.NET版本4.5.1(2013)之前的Marshal.SizeOf<DateTime>()
)将引发异常。这是因为异常(对于Marshal.SizeOf(typeof(DateTime))
)结构布局“自动”。
答案 2 :(得分:0)
Alex Pinsker写了nice solution来获取DateTime
(或任何其他类型)的大小。