为什么我必须提供显式泛型参数类型而编译器应该推断出类型?

Jah*_*ine 13 .net c# generics type-inference

为什么我必须提供显式泛型参数类型而编译器应该推断出类型?

public static T2 Cast<T1,T2>(this T1 arg) where T2 : class where T1 : class
{
    return arg as T2;
}
Run Code Online (Sandbox Code Playgroud)

样品用法:

 objOfTypeT2 = objOfTypeT1.Cast<TypeT1,TypeT2>();
Run Code Online (Sandbox Code Playgroud)


与我对更智能的编译器的期望用法相比:

 objOfTypeT2 = objOfTypeT1.Cast<TypeT2>();
Run Code Online (Sandbox Code Playgroud)

或者我应该更聪明:-)

请注意,我提供了返回类型.我想不提供我在其上调用函数的对象,该方法是一个扩展方法.

Mar*_*ell 18

推理不考虑返回类型; 但是,你可以尝试拆分泛型; 例如,您可以编写代码以允许:

.Cast().To<Type2>()
Run Code Online (Sandbox Code Playgroud)

通过(未经测试;仅供参考)

public static CastHelper<T> Cast<T>(this T obj) {
    return new CastHelper<T>(obj);
}
public struct CastHelper<TFrom> {
    private readonly TFrom obj;
    public CastHelper(TFrom obj) { this.obj = obj;}
    public TTo To<TTo>() {
       // your code here
    }
}
Run Code Online (Sandbox Code Playgroud)


Meh*_*ari 13

规范将泛型方法的类型参数推断限制为全部或全部.你不能有部分推断.

基本原理可能是简化类型推断规则(已经相当复杂,因为它们也必须考虑重载规则).