Class C类实例化问题

Class C类实例化问题,class,visual-studio-2019,abstract,Class,Visual Studio 2019,Abstract,我正在VS2019上运行一个C项目,代码结构如下: 在Class1.cs文件中: 对于line Run算法,我得到以下错误: “Class1.MyClass2”必须是具有公共 无参数构造函数,以便将其用作 泛型类型或方法“Class1.RunAlgorithm” 即使我将其更改为Public,错误仍然存在 至少,它必须受到保护,以便MyClass可以访问它 所以你的班级是1.MyClass2 必须具有公共无参数构造函数消息表示MyClass需要构造函数。上面的我有这样一个构造函数,即使它不在代码

我正在VS2019上运行一个C项目,代码结构如下:

在Class1.cs文件中:

对于line Run算法,我得到以下错误:

“Class1.MyClass2”必须是具有公共 无参数构造函数,以便将其用作 泛型类型或方法“Class1.RunAlgorithm”

即使我将其更改为Public,错误仍然存在

至少,它必须受到保护,以便MyClass可以访问它

所以你的班级是1.MyClass2 必须具有公共无参数构造函数消息表示MyClass需要构造函数。上面的我有这样一个构造函数,即使它不在代码中;在没有开发人员提供构造函数的情况下,编译器只提供一个调用基本无参数构造函数的构造函数

…这就引出了下一点;MyClass2扩展了Class2,因此Class2的构造函数需要可以访问。虽然Class2的构造函数是私有的,但MyClass2的构造函数不能调用它。c上的每个构造函数都必须调用另一个构造函数或基构造函数。如果不指定,编译器将为您插入对base的调用,如果无法访问base构造函数,则调用将失败

为了解决这些问题,您需要在MyClass2中使用公共无参数构造函数:

公共MyClass2:基{} 或者不使用basecompiler将添加基本调用 或者空白编译器将添加所有内容
您需要一些东西使MyClass2可以访问Class2的构造函数,即将Class2的构造函数声明为public或protected

,您正在努力理解错误消息的哪一部分?很清楚…private Class2{}-您希望如何创建MyClass2的实例?@David即使我将其更改为Public,错误仍然存在。@CaiusJard类型不是抽象的,并且我有一个无参数构造函数,因此我已经满足了错误提到的条件。。所以我不明白它为什么会持续存在。发布的代码没有显示Class1.MyClass2有一个公共的无参数构造函数?但是在链接的.NET fiddle中,它编译并运行,没有打印任何内容。如果将构造函数从protected更改为private并再次运行,它将给出一个关于可访问性的错误。如果您在MyClass2中提供了一个非公共构造函数,那么您将得到关于Hanks的错误,在为MyClass2(不仅仅是Class2)添加了一个单独的基构造函数之后,错误得到了解决!:是的,重要的是要记住,如果您提供任何类型的构造函数,那么编译器将不会提供默认的空构造函数
public class Class1
{
    public class MyClass2 : Class2
    {
        ...
    }

    private void RunAlgorithm<T>() where T : Class2, new()
    {
        T argInstance = new T();
        ...
    }

    static void Main(string[] args)
    {
        RunAlgorithm<MyClass2>();
    }

}
public class Class2
{
    public Class2() { }
    public string setParameters { get; set; }
}
public class Class1
{
    class MyClass2 : Class2
    {
    }

    private void RunAlgorithm<T>() where T : Class2, new()
    {
        T argInstance = new T();
    }

    public static void Main(string[] args)
    {
        new Class1().RunAlgorithm<MyClass2>();
    }

}


public class Class2
{
    protected Class2() { }
    public string setParameters { get; set; }
}