如果有以下课程:
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)构造函数将始终存在。我只是不明白为什么会有这种限制。
答案 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