C# 为什么可以';我们在派生类中使用带参数的构造函数

C# 为什么可以';我们在派生类中使用带参数的构造函数,c#,generics,parameters,constructor,derived-class,C#,Generics,Parameters,Constructor,Derived Class,为什么这是不可能的? 当使用构造函数参数实例化“DerivedClass”时,我遇到以下编译器错误: “GenericParameterizedConstructor.DerivedClass”不包含接受1个参数的构造函数 但是调用一个非常类似的方法是可行的 为什么? 类程序 { 静态void Main(字符串[]参数) { //这会产生一个编译错误 //DerivedClass cls=新的DerivedClass(“某些值”); //这个有效; DerivedClass cls2=新的Der

为什么这是不可能的? 当使用构造函数参数实例化“DerivedClass”时,我遇到以下编译器错误:

“GenericParameterizedConstructor.DerivedClass”不包含接受1个参数的构造函数

但是调用一个非常类似的方法是可行的

为什么?

类程序
{
静态void Main(字符串[]参数)
{
//这会产生一个编译错误
//DerivedClass cls=新的DerivedClass(“某些值”);
//这个有效;
DerivedClass cls2=新的DerivedClass();
cls2.某些方法(“某些值”);
}
}
公共类基类
{
内部T值;
公共基类()
{
}
公共基类(T值)
{
这个。值=值;
}
公共方法(T值)
{
这个。值=值;
}
}
公共类派生类:基类
{
}

构造函数不是继承的-就这么简单
DerivedClass
包含一个构造函数—编译器默认提供的公共无参数构造函数,因为您没有指定任何构造函数

请注意,这与泛型无关。如果
BaseClass
不是泛型的,您会看到同样的情况

DerivedClass
提供构造函数很容易,不过:

public class DerivedClass : BaseClass<String>
{
    public DerivedClass() : base()
    {
    }

    public DerivedClass(string value) : base(value)
    {
    }
}
公共类派生类:基类
{
public-DerivedClass():base()
{
}
public-DerivedClass(字符串值):基(值)
{
}
}

构造函数不是继承的-就这么简单
DerivedClass
包含一个构造函数—编译器默认提供的公共无参数构造函数,因为您没有指定任何构造函数

请注意,这与泛型无关。如果
BaseClass
不是泛型的,您会看到同样的情况

DerivedClass
提供构造函数很容易,不过:

public class DerivedClass : BaseClass<String>
{
    public DerivedClass() : base()
    {
    }

    public DerivedClass(string value) : base(value)
    {
    }
}
公共类派生类:基类
{
public-DerivedClass():base()
{
}
public-DerivedClass(字符串值):基(值)
{
}
}

派生类需要公开构造函数

public class DerivedClass : BaseClass<String>
{
    public DerivedClass(string str) :base(str) {}
}
公共类派生类:基类
{
公共派生类(字符串str):基(str){}
}

派生类需要公开构造函数

public class DerivedClass : BaseClass<String>
{
    public DerivedClass(string str) :base(str) {}
}
公共类派生类:基类
{
公共派生类(字符串str):基(str){}
}

如果有一种方法可以指示编译器自动生成特定的派生类构造函数,该构造函数可以精确地模拟和包装基类的所有构造函数,这有时会很有帮助。然而,默认情况下发生这种行为将是有问题的。许多派生类期望在创建其类型的实例时调用其部分代码。假设父类型有两个构造函数:

parentType(int foo) {...} parentType(string foo) {...} 父类型(intfoo){…} 父类型(字符串foo){…} 派生类型有一个:

derivedType(string foo) {...} derivedType(字符串foo){…}
new-derivedType(7)的效果如何?编译器将知道如何创建
新的基类型(7),但如果它创建了一个新的“空白”derivedType对象,然后简单地调用父类型构造函数,那么结果将是一个从未运行过任何
derivedType
构造代码的
derivedType
对象。虽然有些类不会有任何问题(对于这样的类,前面提到的假设特性会很有帮助),但很多类都会


顺便提一下,受保护的构造函数会出现一些相关的问题。在某些.net语言(至少包括当前版本的C#)中,如果非抽象类型
Foo
定义了受保护的构造函数,则该构造函数只能用于创建派生类型的实例。在其他语言中,包括当前的vb.net,派生类型中的代码可以调用基类型的受保护构造函数来创建新的基类型实例。

如果有一种方法可以指示编译器自动生成特定的派生类构造函数,该构造函数精确地模拟和包装基类的所有构造函数,则有时会有所帮助。然而,默认情况下发生这种行为将是有问题的。许多派生类期望在创建其类型的实例时调用其部分代码。假设父类型有两个构造函数:

parentType(int foo) {...} parentType(string foo) {...} 父类型(intfoo){…} 父类型(字符串foo){…} 派生类型有一个:

derivedType(string foo) {...} derivedType(字符串foo){…}
new-derivedType(7)的效果如何?编译器将知道如何创建
新的基类型(7),但如果它创建了一个新的“空白”derivedType对象,然后简单地调用父类型构造函数,那么结果将是一个从未运行过任何
derivedType
构造代码的
derivedType
对象。虽然有些类不会有任何问题(对于这样的类,前面提到的假设特性会很有帮助),但很多类都会


顺便提一下,受保护的构造函数会出现一些相关的问题。在某些.net语言(至少包括当前版本的C#)中,如果非抽象类型
Foo
定义了受保护的构造函数,则该构造函数只能用于创建派生类型的实例。在其他语言中,包括当前的vb.net,派生类型中的代码可以调用基类型的受保护构造函数来创建新的基类型实例。

谢谢。你是对的。误导我的是,在实例化DerivedClass时总是调用class Base的无参数构造函数,即使DerivedClass中有无参数构造函数。谢谢。你是对的。误导我的是,在实例化DerivedClass时,总是调用类基的无参数构造函数,即使是t