Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 枚举按位操作返回错误的值_C#_Enums_Bitwise Operators - Fatal编程技术网

C# 枚举按位操作返回错误的值

C# 枚举按位操作返回错误的值,c#,enums,bitwise-operators,C#,Enums,Bitwise Operators,我有颜色选择enum,表示红色、蓝色、绿色和无 [Flags] public enum SelectedColor { None, Red, Blue, Green } 当我创建一个新枚举并将其设置为红色和绿色时,检查是否设置了蓝色,它返回真蓝色从未设置在任何位置 例如: SelectedColor selectedColor = SelectedColor.Red; selectedColor |= SelectedColor.Green; //Add Green to Select

我有颜色选择
enum
,表示红色、蓝色、绿色和无

[Flags]
public enum SelectedColor
{
    None, Red, Blue, Green
}
当我创建一个新枚举并将其设置为
红色
绿色
时,检查是否设置了
蓝色
,它返回
<代码>蓝色从未设置在任何位置

例如:

SelectedColor selectedColor = SelectedColor.Red;
selectedColor |= SelectedColor.Green; //Add Green to Selection

//Check if blue is set
Debug.Log("Blue Selected hasFlag? : " + hasFlag(selectedColor, SelectedColor.Blue));

//Check if blue is set
Debug.Log("Blue Selected isSet? : " + isSet(selectedColor, SelectedColor.Blue));
输出:

蓝色选定标志?:假的

蓝色选定isSet?:真的

hasFlag和isSet函数:

bool hasFlag(SelectedColor source, SelectedColor value)
{
    int s1 = (int)source;
    return Convert.ToBoolean((s1 & Convert.ToInt32(((int)value) == s1)));
}


bool isSet(SelectedColor source, SelectedColor critValue)
{
    //return ((source & critValue) == critValue);
    return ((source & critValue) != 0);
}
如您所见,my
isSet
函数返回了错误的值。我已经尝试了
return((source&critValue)=critValue)
return((source&critValue)!=0)但它们都失败了。根据我对SO和post的研究,这应该是可行的

My
hasFlag
函数很好,但是为什么
isSet
函数返回了错误的值


请注意,我使用的是.NET 3.5,因此无法使用.NET 4枚举帮助器函数,例如。

如果不为枚举指定值,则会将序号分配给它们,如下所示:

[Flags]
public enum SelectedColor // WRONG
{
    None  = 0, // 000
    Red   = 1, // 001
    Blue  = 2, // 010
    Green = 3  // 011 <-- Not the next power of two!
}
对于
[Flags]
枚举,需要使用2的幂,如下所示:

[Flags]
public enum SelectedColor // CORRECT
{
    None  = 0, // 000
    Red   = 1, // 001
    Blue  = 2, // 010
    Green = 4  // 100
}
然后它就可以正常工作了:

selectedColor = SelectedColor.Red; // 001
selectedColor |= SelectedColor.Green; // (001 | 100) == 101, which is Red, Green 

尽管Matthew的答案是正确的,而且是一个非常好的答案(这个主题有一个“最大化版本”),但我会保持它的“通用性”,并且更简单一点,换一种方式:与层遮罩使用的行为相同。但是,此处的限制是,您的枚举不能超过32项

private void uncleFoo() {
    enum myNATO { Adam, Bravo, Charlie, Delta } //my enum with NATO codes
    int activeNATO = 0; //int to store selected NATO codes

    //some testing here
    activeNATO |= 1 << (int)myNATO.Adam;
    activeNATO |= 1 << (int)myNATO.Bravo;
    activeNATO |= 1 << (int)myNATO.Charlie;
    Debug.Log(activeNATO);
    Debug.Log("has  Adam? " + (activeNATO & 1 << (int)myNATO.Adam));
    Debug.Log("has Delta? " + (activeNATO & 1 << (int)myNATO.Delta));
}
private void uncleFoo(){
枚举我的北约{Adam,Bravo,Charlie,Delta}//我的北约代码枚举
int activeNATO=0;//int用于存储选定的北约代码
//这里有一些测试

activeNATO |=1+1。值得指出的是,如果没有定义显式值,则它是从0.0、1、2、3、4等开始的。其次,
Flags
属性不影响默认值的创建方式。它会影响
ToString
的行为,并且还会向IDE发出信号,指示枚举是否要创建被用作标志。我以前尝试过此enum btiwise操作,但放弃了。现在,我回来后发现我必须为enum提供值。因此,4之后,下一个值是8?@Programmer是的,然后每个后续值都是前一个的两倍。很好,它现在可以工作了。几乎为此发疯了。谢谢。
private void uncleFoo() {
    enum myNATO { Adam, Bravo, Charlie, Delta } //my enum with NATO codes
    int activeNATO = 0; //int to store selected NATO codes

    //some testing here
    activeNATO |= 1 << (int)myNATO.Adam;
    activeNATO |= 1 << (int)myNATO.Bravo;
    activeNATO |= 1 << (int)myNATO.Charlie;
    Debug.Log(activeNATO);
    Debug.Log("has  Adam? " + (activeNATO & 1 << (int)myNATO.Adam));
    Debug.Log("has Delta? " + (activeNATO & 1 << (int)myNATO.Delta));
}