【发布时间】: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::Error 到 winservice::Error?
【问题讨论】:
-
很难回答您的问题,因为它不包含minimal reproducible example。您的错误消息与第 185 行有关,但没有 185 行代码。如果您尝试在Rust Playground 上重现您的错误,如果可能的话,这将使我们更容易为您提供帮助,否则在全新的 Cargo 项目中,然后在edit 您的问题中包含附加信息。您可以使用Rust-specific MRE tips 来减少您在此处发布的原始代码。谢谢!
-
您已链接到
From特征,但没有以任何方式调用From特征。它不是自动的,您必须调用它(直接调用From或间接通过?运算符)。 -
@Shepmaster 谢谢你的建议。我将准备一个最小的可重现示例。
-
@Shepmaster 关于我没有调用
Fromtrait 的评论,rust 文档页面中的示例代码也没有显式调用Fromtrait。
标签: error-handling rust type-conversion