类型'...'没有定义构造函数

Jam*_*man 39 c# constructor

我注意到编译器错误当我错误地尝试实例化一个特殊类时,类型'...'没有定义生成的构造函数.

这让我想知道如果有人试图实例化它,我会如何编写自己的类来促成这个消息.

那么下面的代码,我需要做MyClass什么?

namespace MyNamespace
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass mc = new MyClass();
        }
    }

    class MyClass
    {
        MyClass()
        {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Fré*_*idi 42

如果类仅定义内部构造函数并尝试从另一个程序集实例化它,则会发生此错误(CS0143).

public class MyClass
{
    internal MyClass()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)


Pab*_*tor 25

如果您使用Framework 4或更高版本进行编译并将Interop Types嵌入到托管程序集中,也可能导致此错误.要摆脱此错误,您需要关闭(不嵌入)嵌入式互操作类型.

关闭嵌入的说明:

  1. 在VS2010 Solution Explorer上,右键单击您正在使用的Interop Reference.
  2. 选择属性并查找 Embed Interop Types
  3. 将其从True更改为False

您可以在此处阅读嵌入式互操作类型.

巴勃罗


Jon*_*eet 11

我已成功通过以下方式重现:

  • 在DLL中创建静态类
  • ildasm它将其反编译为IL
  • 编辑IL以从类中删除"abstract"和"sealed"修饰符
  • 用.重建DLL ilasm
  • 编译试图创建类实例的程序

如果不删除abstract/sealed修饰符,C#编译器会将其识别为静态类,并提供不同的错误消息.当然,你可以从"普通"类型开始,也只是删除构造函数.

编辑:我实际上认为我没有提交这个,因为我首先看到了"内部"构造函数.但是,我现在将其保留,因为我的版本使C#编译器正确 - 没有可访问构造函数的类型与真正没有构造函数的类型之间存在差异:)

  • 留给Jon Skeet提出一个不起眼的repro案例:) (12认同)

Bri*_*haw 5

我相信你需要使类的构造函数内部为了让它抛出这个异常.我相信你也需要这个类存在于另一个程序集中.

namespace MyNamespace
{ 
   class Program
   {
       static void Main(string[] args)
       {
           MyClass mc = new MyClass();
       }
   }
}

namespace DifferentNamespace
{
   class MyClass
   {
      internal MyClass()
      {
      }
   }
}
Run Code Online (Sandbox Code Playgroud)