如果我指定基类,为什么我不能用泛型调用参数化构造函数

时间:2013-02-12 18:10:29

标签: c# .net generics constructor compiler-errors

如果有以下课程:

class A
{
    public A(int number)
    {
    }
}

那为什么我不能拥有像这样的通用类:

class B<ParameterClass> where ParameterClass : A
{
    public B()
    {
        ParameterClass a = new ParameterClass(1);
    }
}

我得到一个CS0304并且编译器说我没有new()限制但是我只想调用在A上定义的构造函数并且因为ParameterClass将始终是A,编译器可以确定A( int number)构造函数将始终存在。我只是不明白为什么会有这种限制。

3 个答案:

答案 0 :(得分:7)

仅仅因为在A上声明构造函数并不意味着它将在ParameterClass上声明。例如:

public class Bad : A
{
    public Bad(string x) : base(x.Length)
    {
    }
}

现在我用:

var b = new B<Bad>();

您期望这样做?你编写它的方式,如果 有效,我希望它会尝试调用new Bad(1),这肯定是无效的。

答案 1 :(得分:2)

你误解了泛型。

ParameterClass并非总是A 相反,它始终为A 或继承A 的类型。

继承A的类型不一定与A具有相同的构造函数。

答案 2 :(得分:0)

您需要where子句来限制参数类型,以便您知道它将具有某些方法。你仍然无法以这种方式构造它,因为继承A的类可能没有这样的构造函数。

如何将A的实例传递给B的构造函数以及声明中的where ParameterClass: A