C# IsLittleEndian字段报告错误,但一定是LittleEndian?

C# IsLittleEndian字段报告错误,但一定是LittleEndian?,c#,windows-7,C#,Windows 7,我运行在一台英特尔计算机(Win7 64位)上,据我所知,英特尔使用的是Little Endian。我在C#中使用以下代码进行了尝试: byte[] b2 = new byte[] { 0, 1 }; short b2short = BitConverter.ToInt16(b2, 0); 和b2short==256,这是小端点的预期值 然后我在.NET中读到,BitConverter.IsLittleEndian应该反映系统正在使用的endian,当我在Visual Studio中检查变量时

我运行在一台英特尔计算机(Win7 64位)上,据我所知,英特尔使用的是Little Endian。我在C#中使用以下代码进行了尝试:

byte[] b2 = new byte[] { 0, 1 };
short b2short = BitConverter.ToInt16(b2, 0);
和b2short==256,这是小端点的预期值

然后我在.NET中读到,BitConverter.IsLittleEndian应该反映系统正在使用的endian,当我在Visual Studio中检查变量时,它会报告false,即它不是Little endian

这与64位操作系统有关吗?有什么想法吗


编辑: 坐在我对面的我的同事做了同样的测试(WinVista 32位),得到了同样的结果


编辑2: 这真奇怪。每当我运行代码,并在位转换器完成工作后中断时,IsLittleEndian==false。 但是,如果我添加行Console.WriteLine(BitConverter.IsLittleEndian);后来是真的:

byte[] b2 = new byte[] { 0, 1 };
short b2short = BitConverter.ToInt16(b2, 0);
Console.WriteLine(BitConverter.IsLittleEndian);
// Now the IsLittleEndian is true
但是,一旦我删除Console.WriteLine,它又是假的

我还可以补充一点,即使我在“Console.WriteLine”中中断了IsLittleEndian==true,但如果我完全删除该行,它就是false


编辑3:
正如MarkGravell指出的,这一定是一些计时错误。如果我使用变量BitConverter.IsLittleEndian,它将被初始化,如果我不使用(断开时查看它),它将未初始化,因此为false…

您如何检查它

例如,运行以下短控制台应用程序:

using System;

public class Test
{
    static void Main()
    {
        Console.WriteLine(BitConverter.IsLittleEndian);
    }
}

那印的是什么?您能详细介绍一下您使用的硬件和操作系统吗?

我想知道这是否是一个计时错误,可能与“beforefieldinit”有关。。。你是如何看待价值的?VS调试器可能没有触发类型初始值设定项(用于
位转换器
)(可以说,VS调试器正在暗中窥视)。特别是因为
false
是字段的默认值

在静态构造函数中设置
IsLittleEndian
静态字段;初始化器执行的时间是。。。很难预测。如果您使用的是调试器,那么所有的赌注都是无效的。可靠检查此字段值的唯一方法是通过代码(当CLR将在需要之前的某个点运行初始值设定项时):


不要信任调试器/监视窗口等。

就像Marc说的,这似乎是一个计时错误。使用VS调试器在启动时“窥视”该值,返回false,但如果在messagebox中打印它,则返回true。

Raymond Chen给出了问题的扩展答案(镜像,格式更好)

其要点是:

从调试器读取成员不会执行初始化该成员的代码


因此,当您在VisualStudio中查看字段时,它将报告false,因为静态初始值设定项尚未运行。但是,如果在代码中使用该字段,静态初始值设定项将运行,导致该字段返回实际的正确值。

它是哪个intel?可能是IA64吗?尽管我确信即使在IA64上,它也可能使用LE.Re控制台.WriteLine-请参阅我关于“beforefieldinit”的观点“…我使用的是Intel i920处理器…”“它是一个属性而不是一个变量”-实际上,它是一个静态字段。@Marc:是的,我刚刚删除了该位,并单独发现了它。乔恩:请阅读我上面的“编辑2”作为你问题的答案。这种行为非常奇怪…我正在通过破坏代码或控制台来观察它。可能是这样,它在破坏代码时没有初始化,但在我在代码中使用它时,它被初始化,比如Console.WriteLine。因为他说如果他完全删除该行是错误的,这让我认为他以前在该行上放置了断点,这将在使用位转换器之前触发。我想知道如果他在调用ToInt16之后添加了另一行,而ToInt16与BitConverter无关,并在该行上中断,会发生什么情况?Lasse:如果使用BitConverter.IsLittleEndian(如Console.WriteLine),它甚至在执行该行之前就被初始化了。这是事实,甚至在使用BitConverter之前也是如此。为了额外的乐趣:我刚刚发现这个只读属性实际上是通过VisualStudio的“即时窗口”读/写的。您设置的值会在即时窗口和工具提示中报告回来,但如果您在代码中访问该标志,则不会报告。当您实际进行转换时,您设置的值也会被忽略。谢谢。我在想WTF!
bool isLittleEndian = BitConverter.IsLittleEndian;