[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}试试这两个
可以通过改变{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
[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个成员进行逐一组合对比?
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}试试这两个
可以通过改变{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
[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个成员进行逐一组合对比?
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
顶一下,是否有大侠再帮忙解决一下上面的疑问,万分感激