gpt4 book ai didi

c# - 枚举按位运算返回错误值

转载 作者:行者123 更新时间:2023-11-30 19:15:18 25 4
gpt4 key购买 nike

我有代表红色、蓝色、绿色和无的颜色选择 enum

[Flags]
public enum SelectedColor
{
None, Red, Blue, Green
}

当我创建一个新枚举并将其设置为 RedGreen 然后检查是否设置了 Blue 时,它返回 true Blue 从未在任何地方设置。

例如:

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));

输出:

Blue Selected hasFlag? : False

Blue Selected isSet? : True

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);
}

如您所见,我的 isSet 函数返回了错误的值。我已经尝试了 return ((source & critValue) == critValue)return ((source & critValue) != 0); 但他们都失败了。根据我对 SO 和 this 的研究,这应该有效发布。

我的 hasFlag 函数没问题,但为什么 isSet 函数返回了错误的值?

请注意,我使用的是 .NET 3.5,所以我不能使用 .NET 4 枚举辅助函数,例如 HasFlag .

最佳答案

如果您没有为枚举指定值,则会像这样为它们分配序列号:

[Flags]
public enum SelectedColor // WRONG
{
None = 0, // 000
Red = 1, // 001
Blue = 2, // 010
Green = 3 // 011 <-- Not the next power of two!
}

然后会发生这种情况:

selectedColor = SelectedColor.Red; // 001
selectedColor |= SelectedColor.Green; // (001 | 011 ) == 011, which is still Green

[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

关于c# - 枚举按位运算返回错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40635793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com