我下面有一个标志枚举.
[Flags]
public enum FlagTest
{
None = 0x0,
Flag1 = 0x1,
Flag2 = 0x2,
Flag3 = 0x4
}
Run Code Online (Sandbox Code Playgroud)
我无法将if语句评估为true.
FlagTest testItem = FlagTest.Flag1 | FlagTest.Flag2;
if (testItem == FlagTest.Flag1)
{
// Do something,
// however This is never true.
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我需要检测是否在枚举值中设置了一个标志,哪个类型用Flag属性标记.
通常它是这样的:
(value & flag) == flag
Run Code Online (Sandbox Code Playgroud)
但是因为我需要通用泛型(有时在运行时我的事件只有一个"Enum"引用.我找不到一个简单的方法来使用&运算符.目前我这样做:
public static bool IsSet<T>(this T value, T flags) where T : Enum
{
Type numberType = Enum.GetUnderlyingType(typeof(T));
if (numberType.Equals(typeof(int)))
{
return BoxUnbox<int>(value, flags, (a, b) => (a & b) == b);
}
else if (numberType.Equals(typeof(sbyte)))
{
return BoxUnbox<sbyte>(value, flags, (a, b) => (a & b) == b);
}
else if (numberType.Equals(typeof(byte)))
{
return BoxUnbox<byte>(value, flags, (a, b) => (a & b) == b);
}
else if (numberType.Equals(typeof(short)))
{
return BoxUnbox<short>(value, flags, (a, …Run Code Online (Sandbox Code Playgroud) 我在C#中使用单个&符号来表示"检查第二个条件语句,即使第一个条件语句为假 ".
但以下似乎是一个不同的意义的&彻底,任何人都可以解释如何i & 1在下面的示例?
List<int> scores = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8 };
var evenScores = scores.Where(i => i % 2 == 0);
var evenScores2 = scores.Where(i => (i & 1) == 0);
Run Code Online (Sandbox Code Playgroud)