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的说明:
- 在VS2010 Solution Explorer上,右键单击您正在使用的Interop Reference。
- select“属性”并查找“
Embed Interop Types
- 将其从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立被引用的项目。