Error handling 为什么不是';返回时是否隐式转换了错误类型?

Error handling 为什么不是';返回时是否隐式转换了错误类型?,error-handling,rust,type-conversion,Error Handling,Rust,Type Conversion,以下代码无法编译 // 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 = "c

以下代码无法编译

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

//winservice.rs
#[宏使用]外部板条箱错误;
外部板条箱窗口服务;
使用windows_service::service_manager::{ServiceManager,ServiceManagerAccess};
#[导出(调试,错误)]
发布枚举WinServiceError{
#[错误(display=“无法查询windows服务api”)]
WinAPIRROR(windows_服务::错误),
}
WinServiceError的impl From{
fn-from(错误:windows\u服务::错误)->Self{
WinServiceError::WinapError(错误)
}
}
fn获取管理器(请求访问:ServiceManagerAccess)->结果{
ServiceManager::本地计算机(无::,请求访问)
}
pub fn main(){
//获取管理器();
}
我发现了错误

错误[E0308]:类型不匹配
-->src/winservice.rs:186:5
|
185 | fn获取管理器(请求访问:ServiceManagerAccess)->结果{
|-----------------------------由于返回类型,应为'std::result::result'
186 | ServiceManager::本地计算机(无::,请求访问)
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^`
|
=注意:类型应为'std::result::result'`
找到类型“std::result::result”`

为什么Rust编译器没有从
windows\u service::Error
winservice::Error

多亏@Shepmaster的帮助,我才能够解决这个错误

我没有意识到我正在直接返回结果对象。我必须打开结果对象,以便转换工作

以下代码尝试将类型为
Result
的值返回为
Result

fn获取管理器(请求访问:ServiceManagerAccess)->结果{
ServiceManager::本地计算机(无::,请求访问)
}
但是下面的代码是有效的,因为我们现在正在创建一个具有正确签名的新结果对象,并且rust编译器在创建新对象时执行错误类型之间的转换

fn get_manager(request_access: ServiceManagerAccess) -> Result<ServiceManager, WinServiceError> {
    Ok(ServiceManager::local_computer(None::<&str>, request_access)?)
}
fn获取管理器(请求访问:ServiceManagerAccess)->结果{
正常(ServiceManager::本地计算机(无::,请求访问)?)
}

很难回答您的问题,因为它没有包含。您的错误消息是关于第185行的,但没有185行代码。如果您尝试在上重现错误,我们会更容易帮助您,如果可能的话,否则在全新的货物项目中,则您的问题将包含附加信息。有您可以使用减少您在此处发布的原始代码。谢谢!您已链接到
From
trait,但没有以任何方式调用
From
trait。它不是自动的,您必须调用它(通过直接调用
From
或通过
操作符间接调用)。您可能对;;@Shepmaster感谢您的建议。我将准备一个最小的可复制示例。@Shepmaster关于我不是从trait调用
,rust文档页面中的示例代码也不是从
trait显式调用
fn get_manager(request_access: ServiceManagerAccess) -> Result<ServiceManager, WinServiceError> {
    Ok(ServiceManager::local_computer(None::<&str>, request_access)?)
}