新手求助:关于枚举~

时间:2022-05-18 20:31:43
小弟最近开始看c#,刚看到枚举这章,在MSDN上编译例子时遇到一个问题:
[Flags ]
Public enum Seasons
{
Summer=1,
Autumn-2,
Winter=4,
Spring=8,
}
class Program
    {
         

        static void Main(string[] args)
        {
            Console.WriteLine("{0}",(Seasons)12);
            Console.ReadKey();
        }
    }
}
我发现没有[Flags]编译结果是12 ,有[Flags]编译结果是Winter,Spring
只看到里面提到位域的概念,不是很清楚,想请教高手出现上面现象的原因和内部原理是什么?

5 个解决方案

#1


你问的比较深奥哈

我跟着学~~

#2


Applied .NET framework 第13章讲这个 非常得清楚 楼主用电脑下一个瞧瞧
可以通过改变{0}来改变显示 {0:F}和{0:H}试试这两个

#3


using System;
[Flags]
public enum Seasons
{
    Summer = 1,
    Autumn = 2,
    Winter = 4,
    Spring = 8,
}
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("{0}",(Seasons)12);
        Console.ReadKey();
    }
}

当你用Console.WriteLine输出的时候,实际上是调用了ToString()方法,编译器会试图将12所表示的数值翻译为枚举类型中对应的符号,现在枚举实例对应的数值是12,因此它没有对应的符号,但是ToString()方法会检测到Seasons类型上有应用[Flags]特性,它会据此把枚举数值看做是一组位标记,而非一个单独的数值,由于12是由4和8组合而成,Seasons又定义了4,8所对应的枚举值,所以ToString()方法将产生下面的字符串Winter,Spring

#4


谢谢两位大侠帮助,我在网上查到一条关于flags的解释:
 Flags   属性表示一种特殊的枚举,称为位域。运行库本身不区分传统枚举与位域,但您的语言可能会区分二者。当区分二者的时候,可以对位域(而不是枚举)使用位操作符以产生未命名的值。枚举一般用于列出唯一的元素,如一周的各天、国家或地区名称,等等。位域一般用于列出可能联合发生的质量或数量,比如   Red   And   Big   And   Fast。   

可否如下理解:
当Console.WriteLine("{0}",(Seasons)8);时 ,枚举属于上解释中的“运行库本身不区分传统枚举与位域”,此处属于枚举正常运行,并没有处理到Flags的特性。
当Console.WriteLine("{0}",(Seasons)12);时,枚举无法解释这种情况,转而调用Flags位域功能,而上述解释中的"使用位操作符以产生未命名的值" 其中的未命名值是否可以理解为就是这里12,而“使用位操作符以产生”是否是一个循环的过程,那么循环的工作是如何进行?
以 public enum Seasons
{
    Summer = 1,
    Autumn = 2,
    Winter = 4,
    Spring = 8,
}为例,此搜索过程是否依照常理,对枚举的4个成员进行逐一组合对比?

#5


顶一下,是否有大侠再帮忙解决一下上面的疑问,万分感激

#1


你问的比较深奥哈

我跟着学~~

#2


Applied .NET framework 第13章讲这个 非常得清楚 楼主用电脑下一个瞧瞧
可以通过改变{0}来改变显示 {0:F}和{0:H}试试这两个

#3


using System;
[Flags]
public enum Seasons
{
    Summer = 1,
    Autumn = 2,
    Winter = 4,
    Spring = 8,
}
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("{0}",(Seasons)12);
        Console.ReadKey();
    }
}

当你用Console.WriteLine输出的时候,实际上是调用了ToString()方法,编译器会试图将12所表示的数值翻译为枚举类型中对应的符号,现在枚举实例对应的数值是12,因此它没有对应的符号,但是ToString()方法会检测到Seasons类型上有应用[Flags]特性,它会据此把枚举数值看做是一组位标记,而非一个单独的数值,由于12是由4和8组合而成,Seasons又定义了4,8所对应的枚举值,所以ToString()方法将产生下面的字符串Winter,Spring

#4


谢谢两位大侠帮助,我在网上查到一条关于flags的解释:
 Flags   属性表示一种特殊的枚举,称为位域。运行库本身不区分传统枚举与位域,但您的语言可能会区分二者。当区分二者的时候,可以对位域(而不是枚举)使用位操作符以产生未命名的值。枚举一般用于列出唯一的元素,如一周的各天、国家或地区名称,等等。位域一般用于列出可能联合发生的质量或数量,比如   Red   And   Big   And   Fast。   

可否如下理解:
当Console.WriteLine("{0}",(Seasons)8);时 ,枚举属于上解释中的“运行库本身不区分传统枚举与位域”,此处属于枚举正常运行,并没有处理到Flags的特性。
当Console.WriteLine("{0}",(Seasons)12);时,枚举无法解释这种情况,转而调用Flags位域功能,而上述解释中的"使用位操作符以产生未命名的值" 其中的未命名值是否可以理解为就是这里12,而“使用位操作符以产生”是否是一个循环的过程,那么循环的工作是如何进行?
以 public enum Seasons
{
    Summer = 1,
    Autumn = 2,
    Winter = 4,
    Spring = 8,
}为例,此搜索过程是否依照常理,对枚举的4个成员进行逐一组合对比?

#5


顶一下,是否有大侠再帮忙解决一下上面的疑问,万分感激