为泛型类型实现通用扩展方法

6
如果你正在为泛型类实现通用扩展方法,是否有更好的方法呢? 因为自然而然地会像这样调用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 
    }
}

扩展方法仅适用于非泛型静态类。 - MBen
1
@MBen 不可以在非泛型静态类中声明扩展方法。 - nevgeniev
2个回答

3
如果 func2() 只有通用参数 T,编译器可以推断它并且你可以在不指定参数的情况下调用它。
但是如果你需要这两个参数,你必须显式地指定它们。类型推断是全还是无:要么它可以推断所有使用的类型(这样你就不需要指定它们),要么它不能推断,你必须指定所有的类型。

编译器应该能够随时推断func2的T类型... 因此,基本上我希望将func2声明为以下形式 public static V func2<V>(this A<T> inst),因为在声明T及其约束方面除了冗余之外没有任何意义。 - nevgeniev
也许它应该这样,但实际上并没有。所以你要么接受这个事实,要么使用另一种编程语言。 - svick
2
毫无疑问,这应该被修复:)。如果将func2声明为public static V func2<T, V>(this A<T> inst, IList<V> list),编译器能够推断出T和V两个类型。 - nevgeniev

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

1
问题不在于推断V,而在于推断func2的T。 - nevgeniev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接