Visual Studio在"case变量后面标记代码:"遥不可及的
本文关键字:quot 代码 遥不可及 变量 Studio case Visual | 更新日期: 2023-09-27 18:18:53
我有一个有多个case的switch语句:
ConversionState state = ConversionState.Start; // enum
for(int i = 0; i < source.Length; i ++)
{
switch(state)
{
case ConversionState.Start:
state = ConversionState.Name; // <-- warning here
name += source[i]; // source is a string
break;
case ConversionState.Name:
if(source[i] == ' ') // <-- warning here
{
name = name.ToLower();
if(name[0] == '/')
name = name.SubString(1);
state = ConversionState.Between;
}
else
name += source[i];
break;
case ConversionState.Between: // no code in this case statement, yet to be implemented
break; // <-- warning here
}
}
我在三个标记行上得到一个警告:"检测到不可达代码"。一个案例之后的第一个语句不可能是不可访问的,对吧?我的问题是:
是我的代码有问题,还是警告错误?
如果VS2015认为代码段不可达,当我编译优化时,它会被删除吗?如果不是,我应该忽略这个警告吗?
这个警告是表示标记的线不可达,还是整个箱子不可达?
PS:我知道目前的代码可以重写没有开关,这将解决问题,但未来的代码将被添加,将使它-更容易-维护使用开关。
编辑(由amit dayama请求):
private enum ConversionState
{
Start, Between, Name, Argument, Switch
}
枚举位于类的内部,该类的方法包含最初发布的代码。
编辑2:该代码所在的方法的第一行是throw new NotImplementedException();
。显然,这使得Visual Studio在方法的每个开关中标记每个case的第一行不可访问,但没有其他,有趣的是,不是异常后面的整个代码。
我已经检查了你的代码和一切编译和构建在我身边,使用VS2012。现在VS2015有一些问题,错误列表窗口中有很多误报。
所以问题1:从我的角度来看,你的代码是正确的。
问题2:不完全确定,但相信id不会为了优化而删除它。我可能是错的,但警告的原因是你解决了它,而不是编译器。当我为你找到正确的答案时,我会添加评论。
问题3:行不全。
PS:也许你可以尝试在一些if和else语句中添加花括号。我知道它们不是一行所必需的,但它们可能会导致VS2015
您手动将switch
语句中要检查的变量设置为ConversionState.Start
这是相当简单的,因为在switch
语句之前没有代码可以改变它,visual studio将把其他情况标记为不可访问的代码。
如果我没有错,Visual Studio(或你使用的插件?)无法看到用于switch
语句的变量在这些情况下被改变,因此抛出警告。并回答剩下的问题
如果VS2015认为一个代码段不可达,它会被删除吗当我编译与优化?如果不是,我应该忽略它吗这个警告?
就我所知,警告就是警告。它不会干扰代码的最终结果。它警告你可能有什么地方出错了。
此警告是否表示标记的行不可达,或者整个案子都联系不上?
整个箱子无法到达。控制流永远不会进入这种情况,所以里面的所有代码永远不会被执行。
EDIT从代码审查的角度来看,你的代码确实令人困惑。您使用一个特定的case来运行source
集合中的第0个元素。为什么不在第0个元素上执行这段代码,然后从下一个元素开始循环呢?
我觉得很奇怪。首先,我不知道ConversationState的属性是什么。如果它来自Lync API,属性似乎是错误的,实际是活动,停放,非活动和终止。
那么我将做一个Switch case,像这样
ConversionState state = ConversationState.Active;
for(int i = 0; i < source.Length; i ++)
{
switch(state)
{
case ConversationState.Active:
state = ConversionState.Name;
name += source[i];
break;
case ConversationState.Inactive:
if(source[i] == ' ')
{
name = name.ToLower();
if(name[0] == '/')
name = name.SubString(1);
state = ConversionState.Between;
}
else
name += source[i];
break;
}
问题似乎是你用错了大小写形式。