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

C# 实现泛型类型的泛型扩展方法,c#,generics,extension-methods,C#,Generics,Extension Methods,若你们正在为泛型类实现泛型扩展方法,有更好的方法吗? 因为将func2完全按func1()调用是很自然的,而不是func2(),也就是说,省略T参数并像func2() 公共A类,其中T:class{ 公共V func1(){ //func1可以访问T和V类型 } } 公共静态类ExtA{ //要将func1实现为扩展方法2,需要使用通用参数 //我们需要在T上复制约束 公共静态V func2(这是一个实例),其中T:class{ //func2可以访问V&T } } 在您的示例中,类A不知道V,

若你们正在为泛型类实现泛型扩展方法,有更好的方法吗? 因为将func2完全按
func1()
调用是很自然的,而不是
func2()
,也就是说,省略T参数并像
func2()

公共A类,其中T:class{
公共V func1(){
//func1可以访问T和V类型
}
}
公共静态类ExtA{
//要将func1实现为扩展方法2,需要使用通用参数
//我们需要在T上复制约束
公共静态V func2(这是一个实例),其中T:class{
//func2可以访问V&T
}
}

在您的示例中,类
A
不知道
V
,它只知道
func1
上下文中的
V
。因此,func2无法神奇地推断
V

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


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

扩展方法只能在非泛型静态类上工作。@MBen否。扩展方法可以在非泛型静态类中声明。编译器应该能够随时为func2推断t。。。所以基本上我希望func2声明如下
publicstaticvfunc2(这是一个inst)
,因为在声明T时除了冗余之外什么都没有&它的约束可能是应该的,但它没有。所以你要么生活在这种情况下,要么使用另一种语言。毫无疑问,这应该是固定的:)。就好像func2声明为
publicstaticvfunc2(这是一个inst,IList列表)
编译器能够同时推断T&V问题不是关于推断V,而是关于推断func2的T
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 
    }
}