一个最简单的程序,竟然会有警告,求助

fcm1985 2012-04-25 02:15:08
static void Main(string[] args)
{
switch (4 + 3)
{
case 1:
System.Console.WriteLine("a");
break;
case 2:
Console.WriteLine("b");
break;
case 3:
Console.WriteLine("c");
break;
case 4:
Console.WriteLine("d");
break;
case 3 + 2:
Console.WriteLine("e");
break;
case 6:
Console.WriteLine("f");
break;
default:
Console.WriteLine("0");
break;
}
}

vs发出一个警告,虽然程序还是能编译的:检测到无法访问的代码,这是怎么回事?
...全文
413 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
chen870201 2012-04-25
  • 打赏
  • 举报
回复
警告而已
yhj8848 2012-04-25
  • 打赏
  • 举报
回复
对,楼上说得对,如果你表达式是常量的话,就没有必要使用switch了
烈火蜓蜻 2012-04-25
  • 打赏
  • 举报
回复
case 1:
System.Console.WriteLine("a");
break;
case 2:
Console.WriteLine("b");
break;
case 3:
Console.WriteLine("c");
break;
case 4:
Console.WriteLine("d");
break;
case 3 + 2:
Console.WriteLine("e");
break;
case 6:
Console.WriteLine("f");
break;

因为4+3是常量,上面的分支永远无法被执行到,
你以为人家真傻呀,

现在的编译器,都相当的智能了。
lcawen 2012-04-25
  • 打赏
  • 举报
回复
各位,static void Main(string[] args)
{
switch (1+1)
{
case 1+2:
Console.WriteLine("asjkghjkas");
break;
case 1+1:
Console.WriteLine("sdfkl");
break;

}
Console.ReadKey();
}是可以正常运行的
Tishion 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 的回复:]
引用 9 楼 的回复:

通过了,把switch(3+4)改成变量就ok了,可是这是为什么呢


switch一个常量,导致下面的路径实际上只有一个能够到达,其他的都是无用代码,所以有警告
[/Quote]
正解

另外。
switch 后面可以是任何 表达式
case 后面只能是常量表达式 注意常量表达式 case (3+4):是没有任何语法错误的。

skyworth98 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

通过了,把switch(3+4)改成变量就ok了,可是这是为什么呢
[/Quote]

switch一个常量,导致下面的路径实际上只有一个能够到达,其他的都是无用代码,所以有警告
风飘扬 2012-04-25
  • 打赏
  • 举报
回复
15楼正解。
风飘扬 2012-04-25
  • 打赏
  • 举报
回复
switch (4 + 3)
{
case 1:
System.Console.WriteLine("a");
break;
case 2:
Console.WriteLine("b");
break;
case 3:
Console.WriteLine("c");
break;
case 4:
Console.WriteLine("d");
break;
case 3 + 2:
Console.WriteLine("e");
break;
case 6:
Console.WriteLine("f");
break;
default:
Console.WriteLine("0");
break;
}
case 1 的输出数据出现了警告
传递正能量 2012-04-25
  • 打赏
  • 举报
回复
switch(???)

如果是常量,下面有分支,就有警告,因为你的可能性是固定的,“检测到无法访问的代码” 是说有的代码你写了也是白写,执行不到,C#这样做就不错了,它会自动帮你优化代码,有的编译器直接报错

建议使用 变量

fcm1985 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 的回复:]
再多说几句:
switch case 和if else if 功能一样,就如同几个女孩都喜欢一个男孩,但都要求如果你和我睡觉就不能再亲近其他人,那么,在你没有固定某个女孩时一切都是有可能的,自然女孩们机会均等,一旦你睡了谁,你自然就受到他的警告,其他几个你不能再碰.....
[/Quote]

通俗易懂
woairuijuan9 2012-04-25
  • 打赏
  • 举报
回复
再多说几句:
switch case 和if else if 功能一样,就如同几个女孩都喜欢一个男孩,但都要求如果你和我睡觉就不能再亲近其他人,那么,在你没有固定某个女孩时一切都是有可能的,自然女孩们机会均等,一旦你睡了谁,你自然就受到他的警告,其他几个你不能再碰.....
fcm1985 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 的回复:]
引用 17 楼 的回复:
引用 15 楼 的回复:
说一下我的理解,不一定对。


改成
int i =7;
switch (i)

这样还警告么?我估计是你设定了一个固定的值,编译器发现case中没有一条符合要求的 所以就警告你“检测到无法访问的代码”


写法是对的,但是我觉得你说的不对,如果在case中加入case:7这样一条,default语句中就会报出警告

……
[/Quote]


我感觉也不是这样,如果是这样的话,说明参数还是和每个case标签比较的,不然怎么会直接定位到default中呢
woairuijuan9 2012-04-25
  • 打赏
  • 举报
回复
就好比你在一个函数 return; 后面写几行代码,那些代码就是绝对不会被访问到的代码,和这个其实一样
xuyuchends 2012-04-25
  • 打赏
  • 举报
回复
switch (4 + 3)
这样的话case1到6 岂不是永远走不到
woairuijuan9 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]
引用 12 楼 的回复:
楼上回答驴唇不对马嘴,switch分支的作用是根据switch参数快速定位执行代码,如果你把参数给固定了,那么他只能访问到该参数指定的分支,其他分支都会是无法访问的代码,你说会不会有这么个警告?


兄弟,能具体说说吗,switch语句运行过程和机制是怎么样的?
[/Quote]
switch有用到一个跳转表,所以他判断速度只会比if快,不会比If慢,具体机制参考反汇编,他每个分支都是一个入口,编译至此会顺序定位,如果你把参数定位固定值,一方面switch没意义,另一方面,对固定参数的快速定位具有唯一性,那么就有肯定无法进入的分支入口,肯定会提示有无法访问到的代码
orochiheart 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]
引用 15 楼 的回复:
说一下我的理解,不一定对。


改成
int i =7;
switch (i)

这样还警告么?我估计是你设定了一个固定的值,编译器发现case中没有一条符合要求的 所以就警告你“检测到无法访问的代码”


写法是对的,但是我觉得你说的不对,如果在case中加入case:7这样一条,default语句中就会报出警告
[/Quote]
这修正一下自己的思路,条件是固定值7,那么就说明除了7以外的值都是执行不到的,所以会出现警告“检测到无法访问的代码”

fcm1985 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]
应该 case 3+2 编译器理解为 case 3 前面已经有个一个 case 3 所以会提示警告。

原来的case只能是常量吧,现在语法变得这么宽松了么?
[/Quote]

case中不能用表达式吗?
fcm1985 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
楼上回答驴唇不对马嘴,switch分支的作用是根据switch参数快速定位执行代码,如果你把参数给固定了,那么他只能访问到该参数指定的分支,其他分支都会是无法访问的代码,你说会不会有这么个警告?
[/Quote]

我这样理解对不对:

switch中的参数按照顺序比较每个case标签(包括default标签),在全部比较完后发现可以进入的入口,就进入执行语句,如果没有遇到break,就执行一条语句,知道遇到break为止!

可是我不明白,如果我直接把switch参数设置成固定值,为什么就不和每个case标签(包括default标签)比较了呢?
assky124 2012-04-25
  • 打赏
  • 举报
回复
应该 case 3+2 编译器理解为 case 3 前面已经有个一个 case 3 所以会提示警告。

原来的case只能是常量吧,现在语法变得这么宽松了么?
fcm1985 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
楼上回答驴唇不对马嘴,switch分支的作用是根据switch参数快速定位执行代码,如果你把参数给固定了,那么他只能访问到该参数指定的分支,其他分支都会是无法访问的代码,你说会不会有这么个警告?
[/Quote]

兄弟,能具体说说吗,switch语句运行过程和机制是怎么样的?
加载更多回复(17)

111,126

社区成员

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

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

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