C-Sharp Enum Bitweise prüfen in IF-ELSE-Anweisung
Hi @ All
Irgendwie stehe ich auf dem Schlauch. Ich dachte wenn man ein Enum mit dem [Flags]-Attribut ausstattet, kann man es anschließend bitweise überprüfen.
Funktioniert aber nicht. Kann mir jemand auf die Sprünge helfen wo der Fehler liegt?
hier ein Beispiel:
Danke für eure Hilfe!
Mayho
Irgendwie stehe ich auf dem Schlauch. Ich dachte wenn man ein Enum mit dem [Flags]-Attribut ausstattet, kann man es anschließend bitweise überprüfen.
Funktioniert aber nicht. Kann mir jemand auf die Sprünge helfen wo der Fehler liegt?
hier ein Beispiel:
namespace Tester
{
//[System.FlagsAttribute()]
[Flags]
public enum EnumTest
{
A = 0x01,
B = 0x02,
C = 0x04,
D = 0x04
}
class Program
{
static void Main(string args)
{
EnumTest test = EnumTest.A;
//Bsp. 1)
//Fehler: Der |-Operator kann nicht auf den Operanden von Typ bool und EnumTest angewendet werden
if (test == EnumTest.A | EnumTest.B)
{
//do somthing
}
//Bsp. 2)
// wird einfach übersprungen
if (test == (EnumTest.A | EnumTest.B))
{
//do somthing
}
//Bsp. 3)
//funktioniert! ist aber umständlich, wenn man viele Werte prüfen will.
// ich hätte es gerne wie in BSP. 1
if (test == EnumTest.A || test == EnumTest.B)
{
//do somthing
}
}
}
}
Danke für eure Hilfe!
Mayho
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 579483
Url: https://administrator.de/forum/c-sharp-enum-bitweise-pruefen-in-if-else-anweisung-579483.html
Ausgedruckt am: 25.12.2024 um 02:12 Uhr
8 Kommentare
Neuester Kommentar
Hi,
wenn eine Enum mit [Flags] versehen ist, dann kann man über HasFlag() prüfen.
E.
Edit:
Und wenn man tatsächlich eindeutige Werte hat, dann kann man ja auch einfach addieren und es bleibt eindeutig.
wenn eine Enum mit [Flags] versehen ist, dann kann man über HasFlag() prüfen.
if (test.HasFlag(EnumTest.A))
{
//do somthing
}
if (test.HasFlag(EnumTest.A | EnumTest.B))
{
//do somthing
}
E.
Edit:
Und wenn man tatsächlich eindeutige Werte hat, dann kann man ja auch einfach addieren und es bleibt eindeutig.
Alternativ geht es auch mit den Bitweisen Operatoren zu arbeiten.
if ((test & EnumTest.A) != 0){
}
//usw.
//Fehler: Der |-Operator kann nicht auf den Operanden von Typ bool und EnumTest angewendet werden
Du kannst ja nicht Äpfel mit Birnen vergleichen .Warum also nicht [Flag]A == [Flag]X | [Flag]Z ??
Sagt die Fehlermeldung doch schon.
Ich arbeite doch mit bitweisen Operatoren (siehe):
Aber nicht in der richtigen Art und Weise im Vergleich.
Hier müssen Klammern um die OR verknüpften Flags, das ist ein syntaktischer Fehler.
Beispiel
Gesprochen
Also macht der IF-Vergleich daraus
Und 1 ist nun mal nicht gleich 3.
Ja ist vielleicht etwas unglücklich/missverständlich ausgedrückt.
if(Flag]A == ([Flag]X | [Flag]A)) => wird nicht ausgewertet
Wo ist da die Logik versteckt?
Hier sind die Klammern zwar gesetzt da aber das Ergebnis dieser ist ja nicht das gewollte weil hier ja das Ergebnis der Bitweisen Operation in den Klammern berechnet wird.Wo ist da die Logik versteckt?
Beispiel
enum Test {
A = 0x1,
B = 0x2,
C = 0x4
}
Test t = Test.A;
t = BINÄR (0 0 0 0 0 0 0 1) = 1
(Test.A | Test.B) = BINÄR(0 0 0 0 0 0 0 1) OR BINÄR(0 0 0 0 0 0 1 0) = 3
1 == 3
Ja ist vielleicht etwas unglücklich/missverständlich ausgedrückt.