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

时间:2011-08-05 14:58:24

标签: c# constructor

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

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

以下代码,我需要对MyClass做什么?

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

    class MyClass
    {
        MyClass()
        {
        }
    }
}

6 个答案:

答案 0 :(得分:42)

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

public class MyClass
{
    internal MyClass()
    {
    }
}

答案 1 :(得分:25)

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

关闭嵌入的说明:

  1. 在VS2010 Solution Explorer上,右键单击您正在使用的Interop Reference。
  2. 选择“属性”并查找Embed Interop Types
  3. 将其从 True 更改为 False
  4. 您可以阅读有关嵌入式互操作类型here的信息。

    巴勃罗

答案 2 :(得分:11)

我设法通过以下方式重现:

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

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

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

答案 3 :(得分:5)

我相信您需要将类的构造函数设置为internal才能让它抛出此异常。我相信你还需要这个类存在于另一个程序集中。

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

namespace DifferentNamespace
{
   class MyClass
   {
      internal MyClass()
      {
      }
   }
}

答案 4 :(得分:3)

如前所述,您可以通过尝试从其程序集外部使用CS0143构造函数实例化一个类来获取internal

但我相信这是一个编译错误。生成的错误应为CS0122

  

'member'由于其保护级别而无法访问

...如果您尝试仅使用private构造函数实例化一个类,则会出现错误。

如果您尝试为Double之类的内置类型调用构造函数,那么

CS0143过去(直到C#3.0),但在C#4.0中现在生成CS1729

  

'type'不包含带'number'参数的构造函数。

如果您传递参数

Double d = new Double(1.25);

...如果没有将任何参数传递给构造函数,则根本没有错误。

答案 5 :(得分:0)

另一个选择:代码可能是正确的,但您可能在Visual Studio的不同实例中处理不同的项目,因此您需要首先构建引用的项目。