【问题标题】:Why isn't an error type implicitly converted when I return it?为什么当我返回错误类型时没有隐式转换?
【发布时间】:2019-09-18 14:57:23
【问题描述】:

以下代码编译失败

// winservice.rs

#[macro_use] extern crate err_derive;
extern crate windows_service;

use windows_service::service_manager::{ServiceManager, ServiceManagerAccess};

#[derive(Debug, Error)]
pub enum WinServiceError {
    #[error(display = "could not query windows services api")]
    WinApiError(windows_service::Error),
}

impl From<windows_service::Error> for WinServiceError {
    fn from(error: windows_service::Error) -> Self {
        WinServiceError::WinApiError(error)
    }
}

fn get_manager(request_access: ServiceManagerAccess) -> Result<ServiceManager, WinServiceError> {
    ServiceManager::local_computer(None::<&str>, request_access)
}

pub fn main() {
    // get_manager();
}

我收到了错误

error[E0308]: mismatched types
   --> src/winservice.rs:186:5
    |
185 | fn get_manager(request_access: ServiceManagerAccess) -> Result<ServiceManager, Error> {
    |                                                         ----------------------------- expected `std::result::Result<windows_service::service_manager::ServiceManager, winservice::Error>` because of return type
186 |     ServiceManager::local_computer(None::<&str>, request_access)
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected enum `winservice::Error`, found enum `windows_service::Error`
    |
    = note: expected type `std::result::Result<_, winservice::Error>`
               found type `std::result::Result<_, windows_service::Error>`

为什么 Rust 编译器 auto converting the return type 不是从 windows_service::Errorwinservice::Error

【问题讨论】:

标签: error-handling rust type-conversion


【解决方案1】:

感谢@Shepmaster 的帮助,我能够解决错误。

我没有意识到我直接返回了结果对象。我必须解开结果对象才能进行转换。

以下代码尝试将Result&lt;_, windows_services::Error&gt; 类型的值作为Result&lt;_, WinServiceError&gt; 返回。

fn get_manager(request_access: ServiceManagerAccess) -> Result<ServiceManager, WinServiceError> {
    ServiceManager::local_computer(None::<&str>, request_access)
}

但是下面的代码有效,因为我们现在正在创建一个具有正确签名的新 Result 对象,并且 rust 编译器在创建新对象时执行错误类型之间的转换。

fn get_manager(request_access: ServiceManagerAccess) -> Result<ServiceManager, WinServiceError> {
    Ok(ServiceManager::local_computer(None::<&str>, request_access)?)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    相关资源
    最近更新 更多