失敗する理由
基本的にはこれと同じ違いです:
if (someInteger) // C or C++
vs
if (someInteger != 0) // C#
基本的に、C#は論理演算子と条件に関してははるかに厳密です。bool
つまり、に変換可能なものを使用する必要がありますbool
。
余談ですが、C#でこれが単なる警告ではなく、本格的なエラーである理由もここにあります。
int x = ...;
if (x = 10) // Whoops - meant to be == but it's actually an assignment
この方法で比較を見る場合:
if (10 == x)
これは通常、上記のようなタイプミスを回避しようとしている開発者ですが、実際bool
に定数値と比較しない限り、C#では必要ありません。
問題の修正
私はあなたがただ必要だと思う:
if (((info[i].location & 0x8) != 0)) ||
((info[i].location & 0x100) != 0)) ||
((info[i].location & 0x200) != 0)))
これらの括弧のすべてが必要ではない可能性があります...しかし、別の代替手段は、1つのテストを使用することです。
if ((info[i].location & 0x308) != 0)
結局のところ、これらの3ビットのいずれかが設定されているかどうかをテストしているだけです...
フラグベースの列挙型の使用も検討する必要があります。
[Flags]
public enum LocationTypes
{
Foo = 1 << 3; // The original 0x8
Bar = 1 << 8; // The original 0x100
Baz = 1 << 9; // The original 0x200
}
次に、次を使用できます。
LocationTypes mask = LocationTypes.Foo | LocationTypes.Bar | LocationTypes.Baz;
if ((info[i].location) & mask != 0)
または制約のないメロディーを使用する:
LocationTypes mask = LocationTypes.Foo | LocationTypes.Bar | LocationTypes.Baz;
if (info[i].location.HasAny(mask))