为什么这种类型不允许类型参数?

Why are type parameters are not allowed on this type?

正在尝试编译以下内容,

fn do_it() -> Result<i32, u32> {
    Result::<i32, u32>::Ok(3)
}


fn main() {
    println!("{}", do_it());
}

结果:

./result_test.rs:2:14: 2:17 error: type parameters are not allowed on this type [E0109]
./result_test.rs:2     Result::<i32, u32>::Ok(3)
                                ^~~

为什么这个类型不允许类型参数?

这是一个最小的示例,我的真实示例是一个试图 return 以下内容的宏:

match $reader.$read_func() {
    Ok(n) => Result::<$read_type, LocalReadError>::Ok(n),
    Err(err) => Result::<$read_type, LocalReadError>::Err(
        LocalReadError::from(err)
    ),
}

$read_func 是一个函数,$read_type 是那个函数的 return 类型。 (如果我有一种编程方式来获得它,我会这样做;我不知道如何,所以它是一个 arg ...);按原样,我收到上述错误。如果我删除泛型参数的规范,类型干扰会抱怨它无法确定类型。 (因为它在 match 的一个分支中以 Result<_, LocalReadError> 结束,而在另一个分支中以 Result<$read_type, _> 结束?我不太确定。它说:

error: unable to infer enough type information about `_`; type annotations or generic parameter binding required [E0282]
    match $reader.$read_func() {
                  ^~~~~~~~~~~~

)

注:下面回答为什么不允许类型参数。原来这不是 "unable to infer enough type information" 的原因。 (read_func 是一个函数,在我的例子中,我传递了一个模板函数,但忘记了模板 arg,无法推断。)

这实际上与枚举不一致,was discussed 但认为不够重要以阻止 1.0。

指定类型的工作语法是Result::Ok::<i32, u32>(3)

枚举的作用类似于类型(与您尝试编写的语法一致)和名称空间(名称空间不接受类型参数)之间的东西。

为了演示枚举与命名空间的相似之处,您可以这样写:

use std::result::Result::*;

fn main() {
    println!("{:?}", Ok::<i32, u32>(3));
}

这个命名空间方面是枚举的理想 属性,但是将类型参数移动到人们直觉认为应该出现的位置会使这种类型的代码编写起来非常笨拙。