如何使用不明确的通用参数指定C#返回值?

时间:2016-04-15 20:10:26

标签: c# generics

在C#中,假设我有两个接口:Foo<in P, out C>Bar<C>。另外假设我有两个Bar<int>实现:BarOneBarTwo

我想在Baz()上添加方法Bar<C>,返回类似于:

的内容
public interface Bar<C> {
  // other methods, some of which use C as a type
  // then:
  Foo<..., C> Baz ();
}

public class BarOne : Bar<int> {
  // other methods...
  private class FooImplOne : Foo<string, int> {
    // stuff here
  }
  Foo<string, int> Baz() {
    return new FooImplOne();
  }
}

public class BarTwo : Bar<int> {
  // other methods...
  private class FooImplTwo : Foo<long, int> {
    // stuff here
  }
  Foo<long, int> Baz() {
    return new FooImplTwo();
  }
}

但我对Foo接口定义中Baz返回Bar的第一个参数没有任何说法。在java中,我使用Foo<?, C>作为Bar定义中的返回类型 - 我在C#中做什么?

我发现2008 stackoverflow answer告诉我“在C#中你不能这样做,需要为只有通用参数Foo<P, C>的{​​{1}}定义一个基本接口并返回那个基类型代替“。

现代,2016 C#仍然如此吗?

3 个答案:

答案 0 :(得分:4)

在C#中,您还可以使Method成为具有该方法本地不同类型参数的通用方法

e.g。

public interface Bar<C> {
  Foo<T, C> Baz<T>();
}

See MSDN: Generic Methods

答案 1 :(得分:1)

怎么样

public interface Bar<T1,T2> {
  Foo<T1, T2> Baz ();
}

即在

中传递两个Foo类型的参数

答案 2 :(得分:1)

在Java中,<?><? extends Object>的简写。这意味着尝试使用它的代码只知道它是一个对象。 C#中的等价物只是使用<object>,所以你的界面就是

Foo<object, C> Baz ();