2

とにかく、これが私の問題です。C#で動作するようにC ++プログラム全体を変更していて、ほぼ完了しています。C++プログラムにこのIfステートメントがあります。

if(info[i].location & 0x8 || 
             info[i].location & 0x100|| 
                     info[i].location & 0x200)
{
    //do work
}
else
{
    return
}

そしてもちろん、C#でこれを行うと、「演算子」||が表示されます。タイプ'int'および'int'"エラーのオペランドには適用できません。

私の問題が何であるかについての手がかりは、私がこれらの古いC演算子にかなり慣れていないので、C#がこれを行う方法を持っていると推測しています。

4

2 に答える 2

10

失敗する理由

基本的にはこれと同じ違いです:

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))
于 2012-08-02T21:04:07.827 に答える
4

それはそれが言っていることとほぼ同じです:C#では||、論理のみの演算子であるため、で動作することはできませんint。 (ビット単位の-またはで動作する||)に置き換えることができますが、C#では-ステートメントにブール値が必要なため、式全体をゼロと比較してブール値に変換する必要があります。|intsif

info[i].location & 0x8または、に置き換えることもできます(info[i].location & 0x8 != 0)

于 2012-08-02T21:04:56.257 に答える