功能并非所有的代码路径返回一个值

问题描述:

我有一个函数如下:功能并非所有的代码路径返回一个值

private long GetStakeholderId() 
{ 
    string currentUserId = _userManager.GetUserId(User); 
    long stakeholderId; 

    var users = _userManager.Users; 
    foreach (var user in users) 
    { 
     if (user.Email == currentUserId) 
     { 
      var idForStakeholder = user.Id; 

      var stakeholders = _context.Stakeholders; 
      foreach (var stakeholder in stakeholders) 
      { 
       if (stakeholder.IdentityId == idForStakeholder) 
       { 
        stakeholderId=stakeholder.StakeholderId; 
        return stakeholderId; 

       } 
       else 
       { 
        return 0; 
       } 

      } 

     } 
     return 0; 
    } 
} 

在这里,我得到一个错误说不是所有的代码路径返回一个值。我在想什么,在哪里?

+5

如果它没有进入for循环,那么它将如何返回。您需要在for循环之外返回 – Nkosi

+0

当没有用户时它不返回 – Mafii

+0

写返回0;外部foreach循环 –

将最外层的回路移出回路。如果用户列表为空,则永远不会输入循环。然后没有回报受到打击。

private long GetStakeholderId() 
{ 
    string currentUserId = _userManager.GetUserId(User); 
    long stakeholderId; 

    var users = _userManager.Users; 
    foreach (var user in users) 
    { 
     if (user.Email == currentUserId) 
     { 
      var idForStakeholder = user.Id; 

      var stakeholders = _context.Stakeholders; 
      foreach (var stakeholder in stakeholders) 
      { 
       if (stakeholder.IdentityId == idForStakeholder) 
       { 
        stakeholderId=stakeholder.StakeholderId; 
        return stakeholderId; 

       } 
       else 
       { 
        return 0; 
       } 

      } 

     } 

    } 

    return 0; 
} 

将引发错误,因为你的功能的情况下不返回任何东西你没有进入你的foreach声明。当你的函数返回一个long的值时,你需要返回任何情况下函数结尾的值。我认为问题在于你错位了你的第二个回报,它应该在foreach循环之外。

private long GetStakeholderId() 
{ 
    string currentUserId = _userManager.GetUserId(User); 
    long stakeholderId; 

    var users = _userManager.Users; 
    foreach (var user in users) 
    { 
     if (user.Email == currentUserId) 
     { 
      var idForStakeholder = user.Id; 

      var stakeholders = _context.Stakeholders; 
      foreach (var stakeholder in stakeholders) 
      { 
       if (stakeholder.IdentityId == idForStakeholder) 
       { 
        stakeholderId=stakeholder.StakeholderId; 
        return stakeholderId; 

       } 
       else 
       { 
        return 0; 
       } 

      } 

     } 
    } 
    return 0; // 0 will be returned in any case if you reach the end of the function 
} 

你可能不得不小心你当前的逻辑。如果你的用户的第一个利益相关者不是好的,你直接返回0,而不是检查其他的。只有当您的利益相关者ID都不对应您正在查找的人时,才可能要放置您的return 0。把它放在那里是很好的,因为你不需要检查其他用户,并且可以直接退出该功能。

private long GetStakeholderId() 
{ 
    string currentUserId = _userManager.GetUserId(User); 
    long stakeholderId; 

    var users = _userManager.Users; 
    foreach (var user in users) 
    { 
     if (user.Email == currentUserId) 
     { 
      var idForStakeholder = user.Id; 

      var stakeholders = _context.Stakeholders; 
      foreach (var stakeholder in stakeholders) 
      { 
       if (stakeholder.IdentityId == idForStakeholder) 
       { 
        stakeholderId=stakeholder.StakeholderId; 
        return stakeholderId; 

       } 
      } 

      return 0; // If none of the stakeholder ID correspond to the one you are looking for, it means it doesn't exist. You can return 0 directly there. 
     } 
    } 
    return 0; // This part of code will be reached if the user is not found. 
} 
+1

好吧,伊苏卡。 – Mafii

+1

利益相关者DbSet的foreach意味着你将在数据库上做一个“从利益相关者中选择*”,你不应该这样做。 –

您应该返回一个值作为错误说,外循环返回值,

private long GetStakeholderId() 
{ 
    string currentUserId = _userManager.GetUserId(User); 
    long stakeholderId; 

    var users = _userManager.Users; 
    foreach (var user in users) 
    { 
     if (user.Email == currentUserId) 
     { 
      var idForStakeholder = user.Id; 

      var stakeholders = _context.Stakeholders; 
      foreach (var stakeholder in stakeholders) 
      { 
       if (stakeholder.IdentityId == idForStakeholder) 
       { 
        stakeholderId=stakeholder.StakeholderId; 
        return stakeholderId; 

       } 
       else 
       { 
        return 0; 
       } 

      } 

     } 

    } 

    return 0; 
} 

它可能无法进入for循环,以便将其更改为:

private long GetStakeholderId() 
{ 
    string currentUserId = _userManager.GetUserId(User); 
    long stakeholderId; 

    var users = _userManager.Users; 
    foreach (var user in users) 
    { 
     if (user.Email == currentUserId) 
     { 
      var idForStakeholder = user.Id; 

      var stakeholders = _context.Stakeholders; 
      foreach (var stakeholder in stakeholders) 
      { 
       if (stakeholder.IdentityId == idForStakeholder) 
       { 
        stakeholderId=stakeholder.StakeholderId; 
        return stakeholderId; 

       } 
       else 
       { 
        return 0; 
       } 

      } 

     } 
     return 0; 
    } 
    //Missing RETURN 
    return 0; 
} 

正如其他人所说的,错误是因为在没有用户的情况下你错过了回报(所以它不会进入foreach循环)。然而,你的函数也有其他错误:

  • if (user.Email == currentUserId) { } return 0;
    • 这里您强制,要么在循环中的第一个用户拥有您正在寻找的电子邮件,或返回0
  • if (stakeholder.IdentityId == idForStakeholder) { } else return 0;
    • 在这里,你迫使要么第一利益相关者有您正在寻找的标识,否则将返回0

使用LINQ,可以简化您的整个方法,只是这一点:

private long GetStakeholderId() 
{ 
    string currentUserId = _userManager.GetUserId(User); 
    long stakeholderId; 

    var user = _userManager.Users 
     .Where(u => u.Email == currentUserId) 
     .FirstOrDefault(); // get only the wanted user 
    if (user == null) 
    { 
     return 0; 
    } 

    var stakeholder = _context.Stakeholders 
     .Where(s => s.StakeholderId == user.IdentityId) 
     .FirstOrDefault(); // get only the wanted stakeholder from the database 

    return stakeholder == null ? 0 : stakeholder.StakeholderId; 
} 

你也应该提防的是通过在DbSet财产使用foreach意味着你正在做的一个select * from table数据库。您应该使用LinQ过滤数据库中的集合,而不是在in-memoy中进行。

如此多的快速解答,但是我已经注意到在给定的代码中存在逻辑问题(不确定是否是您的方案的问题)。循环中只有变量stakeholders中的值将只执行一次。这意味着如果条件stakeholder.IdentityId == idForStakeholder满足该方法将返回相应的ID否则它将返回0,因此它跳过执行stakeholders中的其余值(如果您可以跳过这些值,请忽略此项)。如果要继续检查集合中的所有项目,那么你可以使用下面的代码:

private long GetStakeholderId() 
{ 
    string currentUserId = _userManager.GetUserId(User); 
    long stakeholderId = 0; 

    var users = _userManager.Users; 
    foreach (var user in users) 
    { 
     if (user.Email == currentUserId) 
     { 
      var idForStakeholder = user.Id;  
      var stakeholders = _context.Stakeholders; 
      foreach (var stakeholder in stakeholders) 
      { 
       if (stakeholder.IdentityId == idForStakeholder) 
       { 
        stakeholderId=stakeholder.StakeholderId; 
        return stakeholderId;  
       } 
      } 

     } 
    }  
    return stakeholderId; 
} 

现在,这个方法会检查相关人士对所有用户的所有值,并且将返回stakeholderId满足条件(stakeholder.IdentityId == idForStakeholder),否则返回全部循环后的0。现在你也从这个错误中解脱出来了。开始循环前请不要忘记用0初始化stakeholderId;

+1

我想这是一个更好的解决方案,因为即使他们发现匹配,其他人总是返回0 – Nitish