在公共方法中检测到无法访问的代码

时间:2014-08-11 19:45:26

标签: c# asp.net

我在接下来的结尾附近收到“无法检测到的代码”警告 方法:

return RedirectToAction("WorkspaceHome", "Workspace");

有关如何解决此问题的任何想法?谢谢!

public ActionResult Delete_Task_Project(int id)
{
    using (ctx_TaskCollab.TaskCollab tkContext = new ctx_TaskCollab.TaskCollab())
    {
      //get the task 
      ctx_TaskCollab.Task taskToBeDeleted = tkContext.Tasks.Where(x=>x.Task_PK == id).Single();

      //check if the task is being deleted by the owner 
      if (taskToBeDeleted.CreatedBy == User.Identity.Name.ToLower())
      {
          //if the task is a project then delete the subtasks and the project.
          if (taskToBeDeleted.TaskParent_FK == null)
          {
              //get all the subtasks 
              List<ctx_TaskCollab.Task> tasksToBeDeleted = tkContext.Tasks.Where(x=>x.TaskParent_FK == id).ToList();

              foreach (var item in tasksToBeDeleted)
              {
                  item.IsDeleted = true;
              }
              taskToBeDeleted.IsDeleted = true;
              tkContext.SaveChanges();
              return RedirectToAction("WorkspaceHome", "Workspace", new { view="Projects"});
          }
          else { //delete the task
              taskToBeDeleted.IsDeleted = true;
              tkContext.SaveChanges();
              return RedirectToAction("WorkspaceHome", "Workspace", new { view="Tasks"});
          }
          //If the id is a project, delete the project and the tasks.
      }
      else 
          return RedirectToAction("NotAuthorized","Errors");
    }                
    return RedirectToAction("WorkspaceHome", "Workspace");
}

2 个答案:

答案 0 :(得分:2)

您的最终回复声明:

return RedirectToAction("WorkspaceHome", "Workspace");

永远不会执行,因为它之前没有代码路径,不会先返回其他内容。删除此语句以使警告静音。

详细说明,这是方法的简化结构:

using {
    if {
        if {
            return; // 1
        } else {
            return; // 2
        }
    } else {
        return; // 3
    }
}
return; // 4

如果没有先通过其他三个中的一个,您将无法返回第4号声明。编译器已经正确地推断出没有第四个返回语句将执行的情况,因此它是“无法访问的”。无法访问的代码会浪费空间(如果它甚至在编译期间被释放 - 它可以被优化掉)并且通常表示程序员的错误。

答案 1 :(得分:1)

如果if的{​​{1}}没有else,则没有第三种方式,这就是using之后的代码永远不会被执行的原因。您可以通过这种方式简化它,看看我的意思:

using (var foo = SomeDisposable)
{
    if (SomCondition)
    {
        if (SomeOtherCodition)
        {
            return SomeThing;
        }
        else
        { 
            return SomethingElse;
        }
    }
    else
        return HereAllCasesAreHandled;
}
// following code is in the void because it can never be executed:
return RedirectToAction("WorkspaceHome", "Workspace");

因此编译器希望帮助修复此错误。删除冗余代码或更改逻辑。