我正在尝试在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和/或逻辑双向操作的代码。
答案 0 :(得分:1)
我怀疑这是否已经指明。当您明确地布置结构时,您很可能会进入特定于体系结构和特定于实现的行为。
我强烈怀疑你所看到的行为都可以通过想象所有bool
操作被有效地转换为整数运算来解释,然后(必要时)通过检查结果是否为非零来转换结果。通常这很好,只要所有bool
值在内存中使用相同的值(1或0),但在您的情况下,您给它一个意外的值(2)。因此,虽然a.boolValue
和b.boolValue
都是正确的,但a.boolValue ^ b.boolValue
具有对所涉及的两个字节进行异或运算的效果,给出3,在必要时仍将其转换为true
。 p>
最好避免使用这种代码,IMO。你真的需要它,或者你只是好奇吗?