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
    }
}

我在三个标记行上得到一个警告:"检测到不可达代码"。一个案例之后的第一个语句不可能是不可访问的,对吧?我的问题是:

  1. 是我的代码有问题,还是警告错误?

  2. 如果VS2015认为代码段不可达,当我编译优化时,它会被删除吗?如果不是,我应该忽略这个警告吗?

  3. 这个警告是表示标记的线不可达,还是整个箱子不可达?

PS:我知道目前的代码可以重写没有开关,这将解决问题,但未来的代码将被添加,将使它-更容易-维护使用开关。

编辑(由amit dayama请求):

private enum ConversionState
{
  Start, Between, Name, Argument, Switch
}

枚举位于类的内部,该类的方法包含最初发布的代码。

编辑2:该代码所在的方法的第一行是throw new NotImplementedException();。显然,这使得Visual Studio在方法的每个开关中标记每个case的第一行不可访问,但没有其他,有趣的是,不是异常后面的整个代码。

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;
}

问题似乎是你用错了大小写形式。