class 实例化的 C# 问题

C# issue with class instantiation

我是 运行 VS2019 上的一个 C# 项目,代码结构如下:

在 Class1.cs 文件中:

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>();
    }

}

在 Class2.cs 文件中:

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

RunAlgorithm<MyClass2>();

行出现以下错误

'Class1.MyClass2' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'T' in the generic type or method 'Class1.RunAlgorithm()'

even if I change it to Public, the error persists

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

https://dotnetfiddle.net/XFeEdQ

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; }
}

所以你的“Class1.MyClass2 必须有一个 public 无参数构造函数”消息说你的 MyClass 需要一个构造函数。上面我的有这样一个构造函数,即使它不在代码中;在没有开发人员提供构造函数的情况下,编译器提供了一个构造函数除了调用基本的无参数构造函数之外别无他法...

...这让我想到了下一点;您的 MyClass2 扩展了 Class2,因此 Class2 的构造函数需要可供它访问。虽然 Class2 的构造函数是私有的,但 MyClass2 的构造函数不能调用它。 c# 上的每个构造函数都必须调用另一个构造函数或基构造函数。如果您不指定哪个,编译器将为您插入对 base() 的调用,如果基构造函数不可访问,该调用将失败

为了解决这一切,您需要在 MyClass2 中使用 public 无参数构造函数:

  • public MyClass2():base(){}
  • 或没有碱基(编译器将添加碱基调用)
  • 或空白(编译器将全部添加)

并且您需要使 Class2 的构造函数可供 MyClass2 访问的东西,即将 Class2 的构造函数声明为 public 或受保护的