如何解决 bool 方法上的“并非所有代码路径都返回值”?

Posted

技术标签:

【中文标题】如何解决 bool 方法上的“并非所有代码路径都返回值”?【英文标题】:How to resolve "not all code paths return a value" on bool method? 【发布时间】:2016-03-18 10:40:54 【问题描述】:

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

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

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

我用谷歌搜索了错误,结果显示它是因为错误说,该方法没有返回方法返回类型中定义的值。

我已经检查了该方法,它在每个条件下都返回 true 或 false。似乎布尔值没有在 LoginAsync() 内部方法之外返回。

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

这是LoginService(),返回类型为 bool:

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

【问题讨论】:

为什么不在 if-else 块中分配布尔变量的值,并在 TaskScheduler.FromCurrentSynchronizationContext()); 之后返回它? TaskScheduler.FromCurrentSynchronizationContext() 返回什么?很久以前,我在编写汇编语言时被告知,调试具有公共返回点的程序会更容易。现在可能没那么必要了,但我不惜一切代价避免多次退货。正如一个非常好的答案所指出的那样,将两个 return 语句替换为对函数/方法范围返回变量的赋值。然后在函数/方法的末尾返回该值。 【参考方案1】:

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

但更糟糕的是,您正在启动 LoginAsync 调用以在后台线程中完成其工作,然后从您的 LoginService 方法返回立即,在此之前 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;
    

(在至少不记录异常的情况下将异常转换为布尔结果也是一个糟糕的主意,但我没有弄乱你的那部分逻辑。)

然后调用者会说:

var loginResult = await LoginServiceAsync(username, password);

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

【讨论】:

好吧,这实际上更有意义。我将在那里添加一个异常捕获。

以上是关于如何解决 bool 方法上的“并非所有代码路径都返回值”?的主要内容,如果未能解决你的问题,请参考以下文章

如何检测NSTextAttachment上的触摸

针对某些编译器不能使用 bool 类型的解决方法

解决Html.CheckBoxFor中”无法将类型 bool 隐式转换为 bool。存在一个显式转换..."的方法

如何捕捉 UICollectionView 上的手势?

SwiftUI:菜单打开时如何忽略背景上的点击?

uLua/toLua加载protobuf转lua的table为bool的解决方法