C# 类型“…”未定义构造函数
我注意到编译器错误,当我错误地尝试实例化一个特殊类时,类型“…”没有定义构造函数 这让我想知道,当有人试图实例化时,我将如何编写自己的类来加速这条消息 下面的代码,我需要对MyClass做什么 如果该类仅定义构造函数,而您试图从另一个程序集实例化它,则会发生此错误C# 类型“…”未定义构造函数,c#,constructor,C#,Constructor,我注意到编译器错误,当我错误地尝试实例化一个特殊类时,类型“…”没有定义构造函数 这让我想知道,当有人试图实例化时,我将如何编写自己的类来加速这条消息 下面的代码,我需要对MyClass做什么 如果该类仅定义构造函数,而您试图从另一个程序集实例化它,则会发生此错误 public class MyClass { internal MyClass() { } } namespace MyNamespace { class Program { st
public class MyClass
{
internal MyClass()
{
}
}
namespace MyNamespace
{
class Program
{
static void Main(string[] args)
{
MyClass mc = new MyClass();
}
}
}
namespace DifferentNamespace
{
class MyClass
{
internal MyClass()
{
}
}
}
我相信您需要将类的构造函数设置为内部,以便使其抛出此异常。我相信您还需要该类存在于另一个程序集中
public class MyClass
{
internal MyClass()
{
}
}
namespace MyNamespace
{
class Program
{
static void Main(string[] args)
{
MyClass mc = new MyClass();
}
}
}
namespace DifferentNamespace
{
class MyClass
{
internal MyClass()
{
}
}
}
我通过以下方式复制了这一点: 在DLL中创建静态类 使用ildasm将其反编译为IL 编辑IL以从类中删除抽象修饰符和密封修饰符 用ilasm重建DLL 编译试图创建类实例的程序 如果不删除抽象/密封修饰符,C编译器会将其识别为静态类,并给出不同的错误消息。当然,可以从普通类型开始,也可以删除构造函数
编辑:我实际上认为我没有提交这个,因为我首先看到了内部构造函数。但是,我现在就不谈了,因为我的版本使C编译器正确无误——没有可访问构造函数的类型和真正没有构造函数的类型之间有区别:正如前面所说的,您可以尝试从程序集外部用构造函数实例化类 但我相信这是一个编译器错误。生成的错误应为: “成员”由于其保护级别而不可访问 。。。如果您试图仅使用私有构造函数实例化一个类,则会出现此错误 CS0143在C 3.0之前经常出现,如果您尝试调用内置类型的构造函数,例如,但在C 4.0中,现在生成: “type”不包含接受“number”参数的构造函数 如果你通过一个论点 双d=新的双1.25
。。。或者,如果不将任何参数传递给构造函数,则不会出现任何错误 如果您使用Framework 4或更高版本进行编译并将互操作类型嵌入到托管程序集中,也可能会导致此错误。要消除此错误,您需要关闭“不嵌入嵌入的互操作类型” 关闭嵌入的说明: 在VS2010解决方案资源管理器上,右键单击正在使用的互操作引用。 选择属性并查找嵌入互操作类型 将其从True更改为False 您可以阅读有关嵌入式互操作类型的内容
Pablo还有另一种选择:代码可能是正确的,但您可能在VisualStudio的不同实例中处理不同的项目,因此您需要首先构建引用的项目 就这样!这里的关键信息是“从另一个程序集实例化”,我在同一个名称空间中尝试内部关键字,然后是另一个名称空间,但仍然一无所获。这现在是有道理的。干杯如果它位于不同程序集中具有相同名称的命名空间中,或者您不能这样做,该怎么办?@James,调用方确实可以驻留在具有相同名称的命名空间中,但这不会改变任何事情。构造函数仍然是内部的,内部边界是程序集,而不是名称空间。谢谢让乔恩·斯基特想出一个晦涩难懂的重述案例:谢谢。不过,名称空间并不能做到这一点。“我相信一定是大会。”詹姆斯,谢谢你的更新。我将从我的答案中删除该部分。谢谢,这解决了我的问题。注意:如果您在继承类而不是直接实例化类时看到此错误,请参阅