2

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 および/または論理二条件演算を使用するコードに影響する可能性があることに注意してください。

4

1 に答える 1

1

これがまったく指定されているとは思えません。構造体を明示的にレイアウトするまでに、アーキテクチャ固有および実装固有の動作に入る可能性が非常に高くなります。

あなたが見ている動作はすべて、すべてのbool演算が効果的に整数演算に変換され、(必要に応じて) 非ゼロかどうかをチェックして結果を変換すると想像することで説明できると強く思います。すべての値がメモリ内で同じ値 (1 または 0) を使用する限り、通常は問題ありboolませんが、あなたの場合は予期しない値 (2) を与えています。したがって、a.boolValueb.boolValueは両方とも true ですa.boolValue ^ b.boolValueが、関係する 2 バイトを XOR して 3 にする効果があり、必要に応じて変換されtrueます。

この種のコードは避けるのが最善です、IMO。実際にそれが必要だったのですか、それとも単に興味があったのですか?

于 2012-06-29T18:50:53.720 に答える