我有一个带有两个构造函数的通用类Foo<>
。其中之一使用params
关键字接受可变数量的参数。另一个非通用类Bar
从Foo<>
派生。问题在于Bar
不接受使用具有params
的构造函数实例化。
这是一个示例:
using System;
namespace ConsoleApp1
{
class Foo<T> where T : IComparable<T>
{
private Foo() { }
public Foo(params T[] list) : this() { }
}
class Bar : Foo<int> { }
class Program
{
static void Main(string[] args)
{
Foo<int> foo = new Foo<int>(1, 2); // it compiles
Bar bar = new Bar(1, 2); // but CS1729 here!
}
}
}
它给出了编译器错误:
Error CS1729:'Bar'不包含带有2个参数的构造函数
我在这里想念什么?
答案 0 :(得分:3)
您缺少在Foo
中的Bar
中实现该构造函数的方法:
class Foo<T> where T : IComparable<T>
{
private Foo() { }
public Foo(params T[] list) : this() { }
}
class Bar : Foo<int>
{
public Bar(params int[] list) : base(list) { }
}
答案 1 :(得分:2)
这与泛型无关。只是默认情况下,子类中没有继承构造函数。 Foo<int>
具有params int[]
构造函数的事实并不自动意味着Bar
也具有它:
并非派生类继承基类的所有成员。以下成员未继承:
- 实例构造函数,您可以调用它们来创建类的新实例。每个类都必须定义自己的构造函数。
(来自MS Docs的C# Inheritance Tutorial)
您必须为Bar
定义一个特定的构造函数,并将基本调用链接到它:
public Bar (params int[] list) : base(list) {}
答案 2 :(得分:2)
构造函数不在C#中继承。如果不指定构造函数,则编译器将为您生成无参数构造函数,该构造函数将调用基类的无参数构造函数。如果您的类是从没有任何非私有无参数构造函数的基类派生的,则编译器会出错。
因此,使Bar
继承需要Foo
的{{1}}构造函数的计划永远不会奏效。
事实证明,这里发生的是编译器意识到可以通过传递空数组来生成无参数构造函数,该构造函数调用基本params T[]
构造函数。 See it here。
在您的情况下,您需要给Foo(params T[])
自己的构造函数:
Bar