3

我有一个包含多种情况的 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:我知道当前的代码可以在没有 switch 的情况下重写,这将解决问题,但是将来添加的代码将使它 - 非常 - 更容易使用 switch 来维护。

编辑(由 amit dayama 要求):

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

枚举位于具有包含最初发布代码的方法的类中。

编辑 2:此代码所在方法的第一行是throw new NotImplementedException();. 显然,这使得 Visual Studio 将方法中每个 switch 中每个 case 的第一行标记为不可访问,但仅此而已,有趣的是,不是异常之后的整个代码。

4

3 回答 3

1

switch您将在语句中手动检查的变量设置为ConversionState.Start

这很简单,因为在switch声明之前没有代码可以改变它,Visual Studio 会将其他情况标记为无法访问的代码。

如果我没记错的话,Visual Studio(或您使用的插件?)看不到用于switch语句的变量在案例中被更改,从而引发警告。并回答其余问题

如果 VS2015 认为代码片段无法访问,那么当我使用优化进行编译时它会被删除吗?如果没有,我应该忽略这个警告吗?

据我所知,警告就是警告。它不会干扰代码的最终结果。它警告您可能有问题。

此警告是否意味着标记的行不可达,或者整个案例不可达?

整个案子是遥不可及的。在那种情况下,控制流永远不会得到,所以里面的所有代码都不会被执行。

编辑从代码审查方面来看,您的代码确实令人困惑。您使用特定案例来运行source集合中的第 0 个元素。为什么不在第 0 个元素上执行该代码并从下一个元素开始循环呢?

于 2015-10-23T10:26:50.610 回答
1

我检查了你的代码,一切都在我这边编译和构建,使用 VS2012。我现在 VS2015 有一些问题,在错误列表窗口中有很多误报。

所以问题1:从我这边来看,你的代码是正确的。

问题2:不完全确定,但相信id不会为了优化去掉它。我可能是错的,但警告的原因是您解决了它而不是编译器。当我为您找到正确答案时,我会添加评论。

问题3:线路不是全案。

PS:也许您可以尝试将花括号添加到您的一些 if 和 else 语句中。我知道它们不是一个衬垫所必需的,但它们可能会导致 VS2015 中的特定行为

于 2015-10-23T10:14:04.163 回答
0

这对我来说似乎很奇怪。首先,我不知道 ConversationState 的属性是什么。如果它来自 Lync API,则属性似乎错误,实际是 Active、Parked、Inactive 和 Terminated。

所以我会做一个这样的开关盒

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

问题似乎您使用的案例形式错误。如果我错了,请纠正我。

于 2015-10-23T10:14:13.547 回答