C# Parse抛出InvalidCastException

C# Parse抛出InvalidCastException,c#,enums,C#,Enums,我有一行C代码: 它抛出了一个InvalidCastException,我不知道为什么-如果我设置一个断点并在监视窗口中运行Enum.Parse(enumType,allFlags),我会得到预期的结果,而不是错误 enumType被设置为typeof(PixelColor)其中PixelColor是我用于单元测试的枚举,而allFlags被设置为字符串“Red”,这是PixelColor的可能值之一 编辑:这是我的单元测试: [TestMethod] public void IsFlagSet

我有一行C代码:

它抛出了一个
InvalidCastException
,我不知道为什么-如果我设置一个断点并在监视窗口中运行
Enum.Parse(enumType,allFlags)
,我会得到预期的结果,而不是错误

enumType
被设置为
typeof(PixelColor)
其中
PixelColor
是我用于单元测试的枚举,而
allFlags
被设置为字符串
“Red”
,这是
PixelColor
的可能值之一

编辑:这是我的单元测试:

[TestMethod]
public void IsFlagSetStringTest()
{
    Assert.IsTrue(EnumHelper.IsFlagSet(typeof(PixelColor), "Red", "Red"));
    Assert.IsFalse(EnumHelper.IsFlagSet(typeof(PixelColor), "Red", "Green"));
    Assert.IsTrue(EnumHelper.IsFlagSet(typeof(PixelColor), "White", "Red"));
    Assert.IsTrue(EnumHelper.IsFlagSet(typeof(PixelColor), "White", "Red, Green"));
    Assert.IsFalse(EnumHelper.IsFlagSet(typeof(PixelColor), "Red", "Red, Green"));
}
下面是正在测试的方法:

/// <summary>
/// Determines whether a single flag value is specified on an enumeration.
/// </summary>
/// <param name="enumType">The enumeration <see cref="Type"/>.</param>
/// <param name="allFlags">The string value containing all flags.</param>
/// <param name="singleFlag">The single string value to check.</param>
/// <returns>A <see cref="System.Boolean"/> indicating that a single flag value is specified for an enumeration.</returns>
public static bool IsFlagSet(Type enumType, string allFlags, string singleFlag)
{
    // retrieve the flags enumeration value
    var __allFlags = Enum.Parse(enumType, allFlags);
    // retrieve the single flag value
    var __singleFlag = Enum.Parse(enumType, singleFlag);

    // perform bit-wise comparison to see if the single flag is specified
    return (((int)__allFlags & (int)__singleFlag) == (int)__singleFlag);
}
//
///确定是否在枚举上指定单个标志值。
/// 
///枚举。
///包含所有标志的字符串值。
///要检查的单个字符串值。
///指示为枚举指定单个标志值的。
公共静态bool IsFlagSet(类型enumType、字符串allFlags、字符串singleFlag)
{
//检索标志枚举值
var\uuu allFlags=Enum.Parse(enumType,allFlags);
//检索单个标志值
var\uuu singleFlag=Enum.Parse(enumType,singleFlag);
//执行逐位比较以查看是否指定了单个标志
返回(((int)所有标志和(int)单个标志)=(int)单个标志);
}
为了以防万一,这里是用于测试的枚举:

/// <summary>
/// A simple flags enum to use for testing.
/// </summary>
[Flags]
private enum PixelColor
{
    Black = 0,
    Red = 1,
    Green = 2,
    Blue = 4,
    White = Red | Green | Blue
}
//
///用于测试的简单标志枚举。
/// 
[旗帜]
私有枚举像素颜色
{
黑色=0,
红色=1,
绿色=2,
蓝色=4,
白色=红色|绿色|蓝色
}

我怀疑问题在于按位比较:

return (((int)__allFlags & (int)__singleFlag) == (int)__singleFlag);
因为在任何情况下,
Enum.Parse
都不会抛出
InvalidCastException
,而是返回一个
对象
类型


作为调试步骤,注释该行并将其替换为
return true临时,然后运行测试以查看是否引发异常。如果不是,您可能需要在强制转换为
int

之前,在前面的
Parse
行上显式强制转换为枚举类型。您是否使用多线程代码?对我来说,
allFlags
的值似乎是一个可能的竞争条件。你能用“请”编辑这个问题吗?我正在单元测试中运行这个代码;我确实启用了“并行运行单元测试”选项。但是,即使我只运行一个单元测试,但在这里失败,也会发生这种情况。@ekolis需要显示更多代码。向我们展示如何定义和设置变量、枚举类等。您是否可以包含更多相关测试。如果能够拥有完整的上下文,包括您所做的任何设置以及设置
allFlags
值的位置,那就太好了。
return (((int)__allFlags & (int)__singleFlag) == (int)__singleFlag);