我已经创建了一个函数,在我看来总会返回一个值,但函数仍然会说
所有代码路径都不返回值
我错过了什么吗?
public static bool CheckIfSignatureAlreadySignedByUser(SPSite site, SPWeb web, int RowID)
{
RevertToAppPool revert = new RevertToAppPool();
try
{
revert.UseAppPoolIdentity();
string dbConnectionString = site.WebApplication.Properties["dbConnection"].ToString();
using (dbDWDataContext dataContext = new dbDWDataContext(dbConnectionString))
{
var signatures = dataContext.CM_Signatures.Where(c => c.ParagraphID == RowID).ToList();
if (signatures.Any())
{
foreach (var sig in signatures)
{
if (sig.LoginName.ToLower() == web.CurrentUser.LoginName.ToLower())
{
return false;
}
else
return true;
}
}
else
{
return true;
}
}
}
catch (Exception error)
{
SEPUtilities.WriteErrorToLog("Error in DWUtilities.AddSignature: {0}", error.ToString());
return false;
}
finally
{
revert.ReturnToImpersonatingCurrentUser();
}
}
答案 0 :(得分:9)
编译器不知道signatures
总是会产生至少一个结果,因为你之前检查过它:
if (signatures.Any())
{
foreach (var sig in signatures)
{ ... }
// problem here.
在return
声明之后,您希望您做的是foreach
。 (并且为了它的价值,signatures
可以在Any
和foreach
语句之间进行更改,因为另一个线程会修改它。)
答案 1 :(得分:4)
那就是说,我会重构:
if (signatures != null && signatures.Any())
{
foreach (var sig in signatures)
{
if (sig.LoginName.ToLower() == web.CurrentUser.LoginName.ToLower())
{
return false;
}
else
return true;
}
}
else
{
return true;
}
为:
return !signatures.Any(z => z.LoginName.ToLower() == web.CurrentUser.LoginName.ToLower());
答案 2 :(得分:1)
其他人已经回答了,但这里有一些额外的信息。
我认为你的循环不正确:
var signatures = dataContext.CM_Signatures.Where(c => c.ParagraphID == RowID).ToList();
if (signatures.Any())
{
foreach (var sig in signatures)
{
if (sig.LoginName.ToLower() == web.CurrentUser.LoginName.ToLower())
{
return false;
}
else
return true;
}
}
else
{
return true;
}
foreach
循环只会迭代一次。如果您试图找出没有签名与当前用户匹配,那么如果第一个签名匹配,则会失败,即使后一个签名不匹配,因为return false
将提前终止循环。 / p>
也许你的意思是这样做:
return !signatures.Any(sig =>
string.Compare(sig.LoginName, web.CurrentUser.LoginName, StringComparison.OrdinalIgnoreCase) == 0);
答案 3 :(得分:0)
我想if-foreach {if-else}的分支分析失败了,因为VS现在没有签名。任何人都不会输入if。而是尝试写
public static bool CheckIfSignatureAlreadySignedByUser(SPSite site, SPWeb web, int RowID)
{
RevertToAppPool revert = new RevertToAppPool();
try
{
revert.UseAppPoolIdentity();
string dbConnectionString = site.WebApplication.Properties["dbConnection"].ToString();
using (dbDWDataContext dataContext = new dbDWDataContext(dbConnectionString))
{
var signatures = dataContext.CM_Signatures.Where(c => c.ParagraphID == RowID).ToList();
if (signatures != null && signatures.Any())
{
foreach (var sig in signatures)
{
if (sig.LoginName.ToLower() == web.CurrentUser.LoginName.ToLower())
{
return false;
}
else
return true;
}
}
return true;
}
}
catch (Exception error)
{
SEPUtilities.WriteErrorToLog("Error in DWUtilities.AddSignature: {0}", error.ToString());
return false;
}
finally
{
revert.ReturnToImpersonatingCurrentUser();
}
}