功能并非所有的代码路径返回一个值
我有一个函数如下:功能并非所有的代码路径返回一个值
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;
}
}
在这里,我得到一个错误说不是所有的代码路径返回一个值。我在想什么,在哪里?
将最外层的回路移出回路。如果用户列表为空,则永远不会输入循环。然后没有回报受到打击。
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.
}
好吧,伊苏卡。 – Mafii
利益相关者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
;
我想这是一个更好的解决方案,因为即使他们发现匹配,其他人总是返回0 – Nitish
如果它没有进入for循环,那么它将如何返回。您需要在for循环之外返回 – Nkosi
当没有用户时它不返回 – Mafii
写返回0;外部foreach循环 –