Visual Studio 标记 "case variable:" 之后的代码不可访问
Visual Studio marks code just after "case variable:" unreachable
我有一个包含多个 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
}
}
我在三个标记行上收到警告:"unreachable code detected"。一个案例之后的第一个声明不可能是无法访问的,不是吗?我的问题是:
是我的代码有问题,还是警告有误?
如果 VS2015 认为代码片段无法访问,当我使用优化进行编译时它会被删除吗?如果不是,我应该忽略这个警告吗?
这个警告是表示标记的行无法访问,还是整个案例都无法访问?
PS:我知道可以在没有开关的情况下重写当前代码,这将解决问题,但是将来添加的代码将使使用开关更容易维护.
编辑(由 amit dayama 请求):
private enum ConversionState
{
Start, Between, Name, Argument, Switch
}
枚举在 class 中,其方法包含最初发布的代码。
编辑 2:
此代码所在方法的第一行是 throw new NotImplementedException();
。显然,这使得 Visual Studio 标记方法中每个开关中每个案例的第一行无法访问,但没有别的,而且有趣的是,不是异常之后的整个代码。
我已经检查了你的代码,一切都在我这边编译和构建,使用 VS2012。我现在 VS2015 有一些问题,错误列表中有很多误报 Window。
所以问题 1:从我这边来看,你的代码是正确的。
问题2:不完全确定,但相信id不会去掉它进行优化。我可能是错的,但警告的原因是你解决了它而不是编译器。当我为您找到正确答案时,我会添加评论。
问题3:行不是全案。
PS:也许您可以尝试将大括号添加到您的一些 if 和 else 语句中。我知道一个衬里不需要它们,但它们可能会导致 VS2015
中的特定行为
我觉得这很奇怪。
首先我不知道 ConversationState 的属性是什么。
如果是来自 Lync API 属性似乎有误,实际是 Active、Parked、Inactive 和 Terminated。
所以我会像这样做一个 Switch 案例
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;
}
问题似乎是您使用的大小写形式有误。如有不妥请指正
您将 switch
语句中正在检查的变量手动设置为 ConversionState.Start
很简单,因为在 switch
语句之前没有代码可以改变它,visual studio 会将其他情况标记为无法访问的代码。
如果我没记错的话 Visual Studio(或者您使用的插件?)无法看到用于 switch
语句的变量在案例中被更改,因此抛出警告。
并回答其余问题
If VS2015 thinks a code snippet is unreachable, does it get removed
when I compile with optimizations on? If not, should I just ignore
this warning?
据我所知警告就是警告。它不会干扰代码的最终结果。它会警告您可能出现问题。
Does this warning mean that the marked line is unreachable, or that
the whole case is unreachable?
整个案例无法访问。在这种情况下,控制流永远不会得到,所以里面的所有代码都不会被执行。
EDIT 从代码审查的角度来看,您的代码确实令人困惑。您对 source
集合中的第 0 个元素使用 运行 的特定大小写。为什么不在第 0 个元素上执行该代码并从下一个元素开始循环?
我有一个包含多个 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
}
}
我在三个标记行上收到警告:"unreachable code detected"。一个案例之后的第一个声明不可能是无法访问的,不是吗?我的问题是:
是我的代码有问题,还是警告有误?
如果 VS2015 认为代码片段无法访问,当我使用优化进行编译时它会被删除吗?如果不是,我应该忽略这个警告吗?
这个警告是表示标记的行无法访问,还是整个案例都无法访问?
PS:我知道可以在没有开关的情况下重写当前代码,这将解决问题,但是将来添加的代码将使使用开关更容易维护.
编辑(由 amit dayama 请求):
private enum ConversionState
{
Start, Between, Name, Argument, Switch
}
枚举在 class 中,其方法包含最初发布的代码。
编辑 2:
此代码所在方法的第一行是 throw new NotImplementedException();
。显然,这使得 Visual Studio 标记方法中每个开关中每个案例的第一行无法访问,但没有别的,而且有趣的是,不是异常之后的整个代码。
我已经检查了你的代码,一切都在我这边编译和构建,使用 VS2012。我现在 VS2015 有一些问题,错误列表中有很多误报 Window。
所以问题 1:从我这边来看,你的代码是正确的。
问题2:不完全确定,但相信id不会去掉它进行优化。我可能是错的,但警告的原因是你解决了它而不是编译器。当我为您找到正确答案时,我会添加评论。
问题3:行不是全案。
PS:也许您可以尝试将大括号添加到您的一些 if 和 else 语句中。我知道一个衬里不需要它们,但它们可能会导致 VS2015
中的特定行为我觉得这很奇怪。 首先我不知道 ConversationState 的属性是什么。 如果是来自 Lync API 属性似乎有误,实际是 Active、Parked、Inactive 和 Terminated。
所以我会像这样做一个 Switch 案例
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;
}
问题似乎是您使用的大小写形式有误。如有不妥请指正
您将 switch
语句中正在检查的变量手动设置为 ConversionState.Start
很简单,因为在 switch
语句之前没有代码可以改变它,visual studio 会将其他情况标记为无法访问的代码。
如果我没记错的话 Visual Studio(或者您使用的插件?)无法看到用于 switch
语句的变量在案例中被更改,因此抛出警告。
并回答其余问题
If VS2015 thinks a code snippet is unreachable, does it get removed when I compile with optimizations on? If not, should I just ignore this warning?
据我所知警告就是警告。它不会干扰代码的最终结果。它会警告您可能出现问题。
Does this warning mean that the marked line is unreachable, or that the whole case is unreachable?
整个案例无法访问。在这种情况下,控制流永远不会得到,所以里面的所有代码都不会被执行。
EDIT 从代码审查的角度来看,您的代码确实令人困惑。您对 source
集合中的第 0 个元素使用 运行 的特定大小写。为什么不在第 0 个元素上执行该代码并从下一个元素开始循环?