【问题标题】:Implementing Generic Extension Method for Generic Type为泛型类型实现泛型扩展方法
【发布时间】:2011-11-19 16:15:45
【问题描述】:

如果您正在为泛型类实现泛型扩展方法,是否有更好的方法? 因为将 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 没有。扩展方法可以在非泛型静态类中声明

标签: c# generics extension-methods


【解决方案1】:

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

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

【讨论】:

  • 编译器应该能够随时为 func2 推断 T...所以基本上我希望 func2 声明遵循public static V func2&lt;V&gt;(this A&lt;T&gt; inst),因为在声明 T 和它的约束时只有冗余
  • 也许应该,但事实并非如此。所以你要么必须忍受它,要么使用另一种语言。
  • 毫无疑问这应该被修复:)。好像 func2 声明为 public static V func2&lt;T, V&gt;(this A&lt;T&gt; inst, IList&lt;V&gt; list) 编译器能够推断 T & V
【解决方案2】:

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

【讨论】:

  • 问题不是推断 V 而是推断 func2 的 T
猜你喜欢
  • 2014-12-21
  • 1970-01-01
  • 2011-08-09
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多