我注意到编译器错误当我错误地尝试实例化一个特殊类时,类型'...'没有生成构造函数。
这让我想知道如果有人试图实例化它,我会如何编写自己的类来促成这个消息。
以下代码,我需要对MyClass
做什么?
namespace MyNamespace
{
class Program
{
static void Main(string[] args)
{
MyClass mc = new MyClass();
}
}
class MyClass
{
MyClass()
{
}
}
}
答案 0 :(得分:42)
如果类仅定义了CS0143构造函数并且您尝试从另一个程序集实例化它,则会发生此错误(internal)。
public class MyClass
{
internal MyClass()
{
}
}
答案 1 :(得分:25)
如果您使用Framework 4或更高版本进行编译并将Interop Types嵌入到托管程序集中,也可能导致此错误。要消除此错误,您需要关闭(不嵌入)嵌入式互操作类型。
关闭嵌入的说明:
Embed Interop Types
您可以阅读有关嵌入式互操作类型here的信息。
巴勃罗
答案 2 :(得分:11)
我设法通过以下方式重现:
ildasm
将其反编译为IL ilasm
如果不删除抽象/密封修饰符,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
构造函数实例化一个类,则会出现错误。
CS0143
过去(直到C#3.0),但在C#4.0中现在生成CS1729:
'type'不包含带'number'参数的构造函数。
如果您传递参数
Double d = new Double(1.25);
...如果没有将任何参数传递给构造函数,则根本没有错误。
答案 5 :(得分:0)
另一个选择:代码可能是正确的,但您可能在Visual Studio的不同实例中处理不同的项目,因此您需要首先构建引用的项目。