如何解决"并非所有代码路径都返回一个值"关于bool方法?

时间:2015-12-12 15:52:54

标签: c# boolean return boolean-logic

我添加了bool方法,该方法提供执行OAuth身份验证并返回true或false。基于用户和密码检查的结果。

但我在LoginService()方法上收到错误,说明:

'MongoDBApp.Services.AuthenticationService.LoginService(string, string)': not all code paths return a value

我用Google搜索了错误,结果显示它因为错误说明了,该方法不会返回方法返回类型中定义的值。

我检查了方法,并且在每个条件下都返回true或false。似乎bool值不会在LoginAsync()内部方法之外返回。

有谁知道为什么方法没有收到返回的bool值?

这是返回类型为bool的LoginService()

    private bool LoginService(string username, string password)
    {

        string ConnectionName = "Username-Password-Authentication";

        auth0.LoginAsync(connection: ConnectionName, userName: username, password: password).ContinueWith(t =>
        {
            if (t.IsFaulted)
            {
                return false;
            }
            else
            {
                Messenger.Default.Send<UpdateLoginMessage>(new UpdateLoginMessage());
                return true;                  
            }

        },

       TaskScheduler.FromCurrentSynchronizationContext());
    }

1 个答案:

答案 0 :(得分:4)

您的return true方法中没有return falseLoginService,这正是编译器所抱怨的。 (你确实有return truereturn false,但他们不在LoginService,他们在你传递给ContinueWith的lambda中,而且lambda是一个单独的方法。)

但更糟糕的是,您正在开始LoginAsync调用以在后台线程中执行其工作,然后立即从您的LoginService方法返回之前{ {1}} - 或您注册的延续 - 已完成。这几乎肯定不是你想要的。

您真正需要的是LoginAsync方法:

async

(在没有至少记录异常的情况下将异常转换为布尔结果也是一个可怕的想法,但我并没有弄乱你逻辑的这一部分。)

然后来电者会说:

private async Task<bool> LoginServiceAsync(string username, string password)
{
    string ConnectionName = "Username-Password-Authentication";

    try {
        var result = await auth0.LoginAsync(
            connection: ConnectionName, userName: username, password: password);
        Messenger.Default.Send<UpdateLoginMessage>(new UpdateLoginMessage());
        return true;                  
    } catch {
        return false;
    }
}

此时您的所有代码都会成功等待异步调用完成。