是否可以在泛型类上使用构造函数来引入其他泛型类型?

时间:2013-11-16 21:15:49

标签: c# generics

我正在尝试构建一个泛型类,其构造函数引入了一个额外的类型,但编译器说不禁号。

我不太明白为什么以下不起作用:

public class Foo<T>
{
    public Foo<T,TBar>(TBar tBar)
    {
    ...
    }
}

这并不重要,因为我可以使用流畅的api(这可能是首选)来编写课程,但我仍然想知道为什么我不能。我能想到的唯一解释是编译器不喜欢与类级泛型类型声明混合的方法级泛型类型声明。

4 个答案:

答案 0 :(得分:6)

这是不可能的。构造函数不像方法一样被调用,只能通过指定类名来调用(在new关键字之后)。另一方面,普通方法可以有其他泛型类型参数。

答案 1 :(得分:2)

没有。只有类型和方法可以是通用的。您不能拥有通用属性,事件,字段,构造函数或终结器。

请注意,这与包含类型是否是通用无关 - 它只是语言的限制(我怀疑是CLR),基本上。 (有趣的是,Java 确实允许通用构造函数 - 但是Java中的泛型与C#中的泛型完全不同。)

答案 2 :(得分:0)

正如乔恩自己指出的那样,这是不可能的,但有一个共同的解决方法,可以解决问题:

public class Foo<T,TBar>
{
    public Foo(TBar tBar)
    {
        //do something
    }
}

IIUC,对此new的调用正如您所希望的那样

答案 3 :(得分:0)

构造函数是一种特殊方法。您是否注意到在课程名称和new关键字之后出现的parantheses?

Person jack = new Person();

Person();有一个方法调用语法。这是因为它不是类型Person,而是一个与类型本身完全相同的方法,因为要调用语言的设计来初始化类型。

引用C#规范:

  

constructor-declarator的标识符应命名声明实例构造函数的类。如果指定了任何其他名称,则会发生编译时错误。

  

17.10实例构造函数
  实例构造函数是实现初始化类实例所需的操作的成员。实例构造函数使用构造函数声明声明:

如果你看一下构造函数公式,你根本看不到任何泛型声明令牌:

  

构造说明符:
     identifier(formal-parameter-listopt)constructor-initializeropt