2

如果有以下类:

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)构造函数将始终存在。我只是不明白为什么会有这个限制。

4

3 回答 3

7

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

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

现在我使用:

var b = new B<Bad>();

你希望它做什么?您编写它的方式,如果它有效的,我希望它尝试调用new Bad(1),这当然是无效的。

于 2013-02-12T18:12:03.590 回答
2

你误解了泛型。

ParameterClass不会一直如此A
相反,它将始终是A 或继承的类型A

继承的类型A不一定具有与A.

于 2013-02-12T18:11:53.443 回答
0

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

where ParameterClass: A在声明中将A 的实例传递给 B 的构造函数怎么样?

于 2013-02-12T18:19:27.203 回答