types'…'没有定义的构造函数

我注意到编译器错误types'…'没有定义生成的构造函数,当我错误地尝试实例化一个particilar类。

这让我想知道如何去写自己的class级,当有人企图实例化这个消息的时候,我会这样做。

所以下面的代码,我需要做什么MyClass

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

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

 public class MyClass { internal MyClass() { } } 

如果您使用Framework 4或更高版本编译并将Interoptypesembedded到托pipe程序集中,则此错误也可能是原因。 要摆脱这个错误,您需要closures(不embedded)embedded式互操作types。

closuresembedded的说明:

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

您可以在这里阅读关于embedded式互操作types。

巴勃罗

我设法重现这一点:

  • 在DLL中创build一个静态类
  • 使用ildasm将其反编译为IL
  • 编辑IL去除class级中的“抽象”和“密封”修饰语
  • ilasm重buildDLL
  • 编译一个试图创build类的实例的程序

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

编辑:我其实以为我没有提交这个,因为我首先看到了“内部”构造函数。 然而,我现在离开它,因为我的版本使C#编译器正确 – 没有可访问构造函数的types和真正没有构造函数的types之间有区别:)

我相信你将需要使内部类的构造函数,以便引发这个exception。 我相信你还需要在另一个程序集中存在这个类。

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

如上所述,你可以通过从组件外部实例化一个具有内部构造函数的类来获得CS0143 。

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

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

…如果您尝试仅用一个private构造函数实例化一个类,那么这就是错误。

如果您尝试调用内置types(如Double)的构造函数,但是在现在生成CS1729的 C#4.0中, 则会发生CS0143 (最高为C#3.0):

“types”不包含需要“数字”参数的构造函数。

如果你通过一个参数

Double d = new Double(1.25);

如果你没有传递任何参数给构造函数,或者根本没有错误。

还有另外一个select:代码可能是正确的,但是你可能在Visual Studio的不同实例中处理不同的项目,因此你需要先build立被引用的项目。