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

本文关键字:泛型 调用 参数 构造函数 就不能 如果 基类 为什么 | 更新日期: 2023-09-27 17:58:46

如果有以下类:

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

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

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

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

现在我使用:

var b = new B<Bad>();

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

您误解了泛型。

CCD_ 4将不总是CCD_
相反,它将始终是A或继承A的类型。

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

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

在声明

中将A的实例与where ParameterClass: A一起传递给B的构造函数怎么样