【问题标题】:The type '...' has no constructors defined类型“...”没有定义构造函数
【发布时间】:2011-08-05 14:58:23
【问题描述】:

我注意到编译器错误类型“...”没有定义构造函数当我错误地尝试实例化特定类时生成。

这让我想知道我将如何编写自己的类,当有人试图实例化它时会沉淀此消息。

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

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

    class MyClass
    {
        MyClass()
        {
        }
    }
}

【问题讨论】:

标签: c# constructor


【解决方案1】:

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

  • 在 DLL 中创建静态类
  • 使用ildasm反编译成IL
  • 编辑 IL 以从类中删除“抽象”和“密封”修饰符
  • ilasm重建DLL
  • 编译试图创建类实例的程序

如果不删除 abstract/sealed 修饰符,C# 编译器会将其识别为静态类并给出不同的错误消息。当然,您可以从“普通”类型开始,也可以删除构造函数。

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

【讨论】:

  • 让 Jon Skeet 想出一个不起眼的复制案例 :)
【解决方案2】:

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

public class MyClass
{
    internal MyClass()
    {
    }
}

【讨论】:

  • 就是这样!这里的关键信息是“从另一个程序集中实例化它”我在同一个命名空间中尝试internal 关键字,然后是不同的命名空间,但仍然没有。这现在是有道理的。干杯!
  • 如果它在不同程序集中的同名命名空间中怎么办,或者你不能这样做?
  • @James,调用者确实可以驻留在同名的命名空间中,但这不会改变任何事情。构造函数仍然是internalinternal 边界是程序集,而不是命名空间。
  • Durp,确实,我的构造函数是内部的,我没有注意到。谢谢!
【解决方案3】:

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

关闭嵌入的说明:

  1. 在 VS2010 解决方案资源管理器中,右键单击您正在使用的互操作参考。
  2. 选择属性并查找Embed Interop Types
  3. 将其从 True 更改为 False

您可以阅读关于嵌入式互操作类型here

巴勃罗

【讨论】:

  • 谢谢,这解决了我的问题。
【解决方案4】:

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

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

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

【讨论】:

  • 谢谢。但是,命名空间并没有这样做。我相信一定是大会。
  • @James,感谢您的更新。我将从我的答案中删除该部分。
【解决方案5】:

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

但我相信这是一个编译器错误。产生的错误应该是CS0122:

“成员”由于其保护级别而无法访问

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

如果您尝试为像Double 这样的内置类型调用构造函数,则过去会发生CS0143(直到 C# 3.0),但在现在生成 CS1729 的 C# 4.0 中:

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

如果你传递一个参数

Double d = new Double(1.25);

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

【讨论】:

    【解决方案6】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      • 1970-01-01
      • 1970-01-01
      • 2014-02-28
      • 2023-01-01
      • 1970-01-01
      相关资源
      最近更新 更多