实现泛型类型的泛型扩展方法

本文关键字:扩展 方法 泛型 泛型类型 实现 | 更新日期: 2023-09-27 18:15:07

如果您正在实现泛型类的泛型扩展方法,是否有更好的方法?因为将func2称为func1<V>()而不是func2<T, V>()是很自然的也就是说,省略T参数并将其称为func2<V>()

public class A<T> where T : class {
    public V func1<V>() {
        //func1 has access to T and V types
    }
}
public static class ExtA {
    // to implement func1 as extension method 2 generic parameters required
    // and we need to duplicate constraint on T 
    public static V func2<T, V>(this A<T> instance) where T : class {
        // func2 has access to V & T 
    }
}

实现泛型类型的泛型扩展方法

如果func2()只有泛型参数T,编译器可以推断它,您可以不指定参数调用它。

但是如果您需要这两个参数,则必须显式指定它们。类型推断是要么全有要么全无:要么它可以推断所使用的所有类型(并且您不必指定它们),要么它不能,您必须指定所有类型。

在你的例子中,类A不知道V,它只知道func1上下文中的V。所以func2不能神奇地推断出V