为什么如果我指定基类,就不能用泛型调用参数化构造函数
本文关键字:泛型 调用 参数 构造函数 就不能 如果 基类 为什么 | 更新日期: 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的类可能没有这样的构造函数。
在声明
where ParameterClass: A
一起传递给B的构造函数怎么样