枚举中一个比较怪异的问题。如下代码所示,100分相赠。

guomaomao1981 2010-04-16 04:31:26

public enum Rank
{
First,
Second,
Third
}
class Program
{
static void Main(string[] args)
{
Rank r = 0; //没错
Rank rr = 1;//有错,为什么??????????
}
}

请帮忙解答,谢谢。
...全文
154 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
guomaomao1981 2010-04-16
  • 打赏
  • 举报
回复
谢谢各位了,Rank rr=(Rank)1;这个我知道的,我就是不太清楚为什么0可以直接给,而1就不行。给分结贴了。谢谢各位了。
chy_1015 2010-04-16
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 vrhero 的回复:]
引用 12 楼 peter200694013 的回复:
Rank r = 0; //0不是枚举成员值,也没有检查。我知道如果枚举对应的值如果枚举中没
//有,输出则是对应的Int32 0

当然不检查...5楼说的还不清楚吗?值类型不可为null,必须有值,默认就是0...所以才有设计准则...

一定要在简单枚举中提供一个零值。

如果可能,将此值命名为 None。如果 None……
[/Quote]

同意
vrhero 2010-04-16
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 peter200694013 的回复:]
Rank r = 0; //0不是枚举成员值,也没有检查。我知道如果枚举对应的值如果枚举中没
//有,输出则是对应的Int32 0
[/Quote]
当然不检查...5楼说的还不清楚吗?值类型不可为null,必须有值,默认就是0...所以才有设计准则...

一定要在简单枚举中提供一个零值。

如果可能,将此值命名为 None。如果 None 不适合,请将零值赋给最常用的值(默认值)。


你这种只能属于设计不合规范,问题代码...
Peter200694013 2010-04-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 vrhero 的回复:]
因为0是所有未赋值的值类型的默认值...enum成员如果没有显式指定值,默认为第一个枚举成员赋0值...

也因此...MSDN中明确规定:创建枚举时,应选择最合理的默认值并赋给它一个零值。这便使得只要在创建枚举时未为其显式赋值,则所创建的全部枚举都将具有该默认值。
[/Quote]
学习了
但是如果:
public enum Rank
{
First=1,
Second,
Third
}
class Program
{
static void Main(string[] args)
{
Rank r = 0; //0不是枚举成员值,也没有检查。我知道如果枚举对应的值如果枚举中没
//有,输出则是对应的Int32 0
}
}
myhuli120 2010-04-16
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!
symbol_bc 2010-04-16
  • 打赏
  • 举报
回复
学习了,接分
toxuecheng111 2010-04-16
  • 打赏
  • 举报
回复
学习了。。。东西都是细心研究出来的
lovelan1748 2010-04-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 vrhero 的回复:]
因为0是所有未赋值的值类型的默认值...enum成员如果没有显式指定值,默认为第一个枚举成员赋0值...

也因此...MSDN中明确规定:创建枚举时,应选择最合理的默认值并赋给它一个零值。这便使得只要在创建枚举时未为其显式赋值,则所创建的全部枚举都将具有该默认值。
[/Quote]
学习
vrhero 2010-04-16
  • 打赏
  • 举报
回复
也因此...非0值并不是能够明确判定是否有效枚举成员的值,所以必须强制转换...
悔说话的哑巴 2010-04-16
  • 打赏
  • 举报
回复

Rank rr = (Rank)1;
vrhero 2010-04-16
  • 打赏
  • 举报
回复
因为0是所有未赋值的值类型的默认值...enum成员如果没有显式指定值,默认为第一个枚举成员赋0值...

也因此...MSDN中明确规定:创建枚举时,应选择最合理的默认值并赋给它一个零值。这便使得只要在创建枚举时未为其显式赋值,则所创建的全部枚举都将具有该默认值。
Peter200694013 2010-04-16
  • 打赏
  • 举报
回复
0可以,1不可以,怪...
llsus 2010-04-16
  • 打赏
  • 举报
回复
因为枚举类型的值,并非从0到N连续的,你不指定具体类型,系统不知道你赋值1应该取第几个值.
llsus 2010-04-16
  • 打赏
  • 举报
回复
要加类型转换的 Rank rr=(Rank)1;
wuyi8808 2010-04-16
  • 打赏
  • 举报
回复
Rank rr = (Rank)1;

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧