从封闭通用中提取通用类型

时间:2010-12-06 17:53:58

标签: c# generics types

我想要这样的事情:

class Foo<T>{...}

class Boo<T>{

   Queue<T> stuff = new Queue<T>();

   public void Boo(Foo<T>){...};
}

...

//Extract the generic type - string - to define the type
//of MyBoo.
var MyBoo = new Boo(new Foo<string>());

我得到错误“泛型类型'Boo'需要'1'类型参数。雅,我通过明确说明模板类型来修复问题,但我想知道是否有/是一种方法来提取隐式输入,而不是必须明确说明。

这是另一个post may be related,但我不确定。

2 个答案:

答案 0 :(得分:3)

类型推断仅适用于方法。因此,如果您有通用方法,并且很清楚如何替换泛型参数,它将被编译器替代。对于new运算符,它不起作用,因此请考虑创建像Create这样生成Boo实例的工厂方法。否则不可能。

答案 1 :(得分:3)

您不能直接使用泛型类型的构造函数来执行此操作,但您可以使用泛型方法,例如在非泛型类中:

public static class Boo
{
    public Boo<T> Create<T>(Foo<T> foo)
    {
        return new Boo<T>(foo);
    }
}

然后:

// myBoo will be inferred to be of type Boo<string>
var myBoo = Boo.Create(new Foo<string>());

当然, 不是另一个名为Boo的类 - 它可能是完全不同的东西,它可能是其他东西的实例方法:

var factory = new BooFactory();
var myBoo = factory.Create(new Foo<string>());

重要的是,它是一个通用的方法 - 类型参数可以推断为泛型方法,但不能用于泛型类型。