C# NET中的标志枚举

C# NET中的标志枚举,c#,.net,enums,enum-flags,C#,.net,Enums,Enum Flags,我试图使用一组条件语句来设置带有[Flags]属性的枚举。但是,编译器抱怨“m”未赋值。如何重写以下内容以实现预期功能 Media m; if (filterOptions.ShowAudioFiles) m = m | Media.Audio; if (filterOptions.ShowDocumentFiles) m = m | Media.Document; if (filterOptions.ShowImageFiles) m = m | Media.Image

我试图使用一组条件语句来设置带有[Flags]属性的枚举。但是,编译器抱怨“m”未赋值。如何重写以下内容以实现预期功能

Media m;
if (filterOptions.ShowAudioFiles)
    m = m | Media.Audio;
if (filterOptions.ShowDocumentFiles)
    m = m | Media.Document;
if (filterOptions.ShowImageFiles)
    m = m | Media.Image;
if (filterOptions.ShowVideoFiles)
    m = m | Media.Video;

如果没有一个条件是真的,那么m将是未定义的。将其设置为初始值。

您需要初始化m。创建值为0的“无”标志,然后:

Media m = Media.None;

然后是代码的其余部分。

是否有类似filterOptions.ShowNone的“默认”选项?如果是这样的话,首先将m设置为该值。编译器正在抱怨,因为在所有if的末尾,m可能没有设置为任何值。

您实际上不需要创建
媒体。无
。您可以将任何值强制转换为标志枚举,即使它不等于标志的值

Media m = (Media)0;

if (filterOptions.ShowAudioFiles)     m |= Media.Audio; 

if (filterOptions.ShowDocumentFiles)  m |= Media.Document; 

if (filterOptions.ShowImageFiles)     m |= Media.Image; 

if (filterOptions.ShowVideoFiles)     m |= Media.Video;

除了上述答案之外,除了这段代码看起来相当多余之外,我建议您使用一个Select Case,而不是那些丑陋的If。

您还可以编写:

Media m = default(Media)

在您不知道枚举、类或它是否是值/引用类型的情况下非常有用。

如果所有条件都失败了怎么办?如果0是媒体音频,该怎么办?您需要一个有效的初始值。这是错误的建议。与依赖整数强制转换相比,使用显式值总是更好。即使没有“有效”标志集,枚举仍然可以正常工作。还是有价值的。默认情况下,所有枚举都从“Int32”继承。是的,如果不处理默认值,以后可能会出现其他问题。但这就是异常的用途。因为它是一个标志枚举,None值应该映射到0(未设置位)。用任何其他方式都会很奇怪。另一方面,您可能需要一个Media.Default,它设置了一些位。哎哟。因此,您要等到稍后引发异常时,而不是在forst位置正确初始化数据?又是哎哟。考虑到任何标志的组合都可以设置,我不认为选择一个案例是合适的。同意,-1,因为你不能用开关替换那些ifs。这真是个坏主意,它隐藏了枚举的全部简单性。创建它们是为了删除幻数,而当您应该使用的标志枚举中应该有一个None时,您将其添加回。这一点很好。我在考虑你不是作者的情况,但无论如何,明确选择默认值会更好。