【问题标题】:Enum.IsDefined with flagged enumsEnum.IsDefined 带有标记的枚举
【发布时间】:2011-02-09 20:21:29
【问题描述】:

我目前正在阅读《C# 4.0 in a Nutshell》这本书,顺便说一句,我认为这本书非常好,即使是高级程序员也可以作为很好的参考。

我在回顾有关基础知识的章节时,遇到了一个技巧,可以判断在使用标记枚举时是否在枚举中定义了某个值。
该书指出,使用Enum.IsDefined 不适用于标记的枚举,并建议使用这样的解决方法:

static bool IsFlagDefined(Enum e)
{
    decimal d;
    return (!decimal.TryParse(e.ToString(), out d);
}

如果在标记的枚举中定义了某个值,这应该返回 true。

有人可以向我解释一下为什么会这样吗?

提前致谢:)

【问题讨论】:

  • 顺便说一句,Enum.IsDefined 的行为可能与预期不同(或者可能是默认值(T))。 Enum.IsDefined(default(T)) 可以返回 true 和 false。 default(T)(其中 T 是一个枚举)总是返回 (T)0,因此如果 T 没有 (T)0 的有效值,则结果为 false。至少让我失望过一次

标签: c# c#-4.0 enums flags


【解决方案1】:

基本上,对使用[Flags] 属性声明的类型的任何enum 值调用ToString 将为任何定义的值返回类似的内容:

SomeValue, SomeOtherValue

另一方面,如果值没有enum类型中定义,那么ToString将简单地生成该值的整数值的字符串表示,例如:

5

所以这意味着如果你可以将ToString 的输出解析为一个数字(不知道作者为什么选择decimal),它没有在类型中定义。

这是一个插图:

[Flags]
enum SomeEnum
{
    SomeValue = 1,
    SomeOtherValue = 2,
    SomeFinalValue = 4
}

public class Program
{
    public static void Main()
    {
        // This is defined.
        SomeEnum x = SomeEnum.SomeOtherValue | SomeEnum.SomeFinalValue;

        Console.WriteLine(x);

        // This is not (no bitwise combination of 1, 2, and 4 will produce 8).
        x = (SomeEnum)8;

        Console.WriteLine(x);
    }
}

上述程序的输出为:

SomeOtherValue, SomeFinalValue 8

所以你可以看到建议的方法是如何工作的。

【讨论】:

  • 应该 SomeEnum.SomeValue = 0 吗?
  • @PaulB:可以。你问是因为通常有一个None 0 值吗?这是真的,而且可能不那么令人困惑。也许我会更新答案,以免让任何人失望。
  • 是的 - 只是你不能代表 SomeValue 与其他任何人...感谢您的更改 :)
【解决方案2】:

如果e 的值不能使用标志组合创建,ToString() 默认为整数。整数当然会解析为decimal

但是为什么你的代码解析为十进制对我来说并不完全清楚。但可能整数类型不适用于基于Int64UInt64enums。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多