C# 实现泛型类型的泛型扩展方法
若你们正在为泛型类实现泛型扩展方法,有更好的方法吗? 因为将func2完全按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,
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
}
}