c# - 显式布局类型中 bool 字段的语义 (ECMA-334)

标签 c# boolean specifications language-specifications

我试图找到在 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 两节,所以我假设在其他地方有一个异常(exception)说明涵盖了这些情况。请注意,这不会影响使用 AND、OR、NAND 或 NOR 运算的代码,但会影响使用 XOR 和/或逻辑双条件运算的代码。

最佳答案

我怀疑这根本不是指定的。当您明确地布置您的结构时,您很可能会进入特定于体系结构和特定于实现的行为。

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

IMO,最好避免这种代码。您是真的需要它,还是只是好奇?

关于c# - 显式布局类型中 bool 字段的语义 (ECMA-334),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11267334/

相关文章:

go - golang规范中有关方法值的部分中的 'non-interface method'是什么意思?

java - Tomcat 是否实现或运行 Java Servlet 和 JavaServer Pages (JSP) 规范?

c# - C# 通用应用平台中证书的公钥

c# - 哪些设计模式对此有用?

PHP 返回一个字符串为 false

iphone - 将 BOOL 值转换为 INT 的正确方法?

python - 通过 Column Pandas 获取计数

java - 一个类型如何有多个父类(super class)型,它们是数组类型,而不是它本身是数组类型?

c# - 在 Redis 中必须是具有公共(public)无参数构造函数的非抽象类型

c# - 在不实现的情况下使用 Linq Indexof StartIndex