并非所有代码路径都返回值 - 出了什么问题?

时间:2015-10-23 12:26:00

标签: c#

我已经创建了一个函数,在我看来总会返回一个值,但函数仍然会说

  

所有代码路径都不返回值

我错过了什么吗?

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

4 个答案:

答案 0 :(得分:9)

编译器不知道signatures总是会产生至少一个结果,因为你之前检查过它:

if (signatures.Any())
{
    foreach (var sig in signatures)
    { ... }

    // problem here.

return声明之后,您希望您做的是foreach。 (并且为了它的价值,signatures 可以在Anyforeach语句之间进行更改,因为另一个线程会修改它。)

答案 1 :(得分:4)

@Patrick Hofman有正确的答案。

那就是说,我会重构:

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

    }