我试图找到在ECMA-334(C#语言规范)中定义以下行为的位置。源程序如下。

static void Main(string[] args)
{
    TestStruct a = new TestStruct();
    a.byteValue = 1;
    TestStruct b = new TestStruct();
    b.byteValue = 2;

    Console.WriteLine(string.Format("Result of {0}=={1} is {2}.",
        a.boolValue, b.boolValue, a.boolValue == b.boolValue));
    Console.WriteLine(string.Format("Result of {0}!={1} is {2}.",
        a.boolValue, b.boolValue, a.boolValue != b.boolValue));
    Console.WriteLine(string.Format("Result of {0}^{1} is {2}.",
        a.boolValue, b.boolValue, a.boolValue ^ b.boolValue));
}

[StructLayout(LayoutKind.Explicit, Pack = 1)]
struct TestStruct
{
    [FieldOffset(0)]
    public bool boolValue;
    [FieldOffset(0)]
    public byte byteValue;
}


执行结果如下。

Result of True==True is False.
Result of True!=True is True.
Result of True^True is True.


这违反了第14.9.4节和第14.10.3节,因此我假设其他地方有一个涉及这些情况的例外情况。请注意,这不会影响使用AND,OR,NAND或NOR运算的代码,但是会影响使用XOR和/或逻辑双条件运算的代码。

最佳答案

我怀疑这是完全指定的。在您明确布局结构时,您很有可能会进入特定于体系结构和特定于实现的行为。

我强烈怀疑,您所看到的行为可以通过想象所有bool操作均有效地转换为整数操作,然后(在必要时)通过检查结果是否为非零来转换来解释。通常,这很好,只要所有bool值在内存中使用相同的值(1或0),但是在您的情况下,您将给它一个意外的值(2)。因此,尽管a.boolValueb.boolValue都为真,但a.boolValue ^ b.boolValue具有对涉及的两个字节进行XOR运算的效果,即3,在需要时仍会转换为true

最好避免使用此类代码IMO。您实际上是否需要它,还是只是好奇?

10-04 23:42