. net日期时间没有预定义的大小



由于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开始,您可以在预定义类型(如intenum类型)上使用它,但不能在其他结构(如DateTime)上使用它,如您所见。)


注意DateTime结构体是异常的,因为Marshal.SizeOf<DateTime>()(或。net 4.5.1(2013)之前的Marshal.SizeOf(typeof(DateTime)))会抛出异常。这是因为不寻常的(对于struct)结构布局"Auto"。

Alex Pinsker为获取DateTime(或任何其他类型)的大小编写了很好的解决方案。

相关内容

  • 没有找到相关文章

最新更新