C# 类型“…”未定义构造函数

C# 类型“…”未定义构造函数,c#,constructor,C#,Constructor,我注意到编译器错误,当我错误地尝试实例化一个特殊类时,类型“…”没有定义构造函数 这让我想知道,当有人试图实例化时,我将如何编写自己的类来加速这条消息 下面的代码,我需要对MyClass做什么 如果该类仅定义构造函数,而您试图从另一个程序集实例化它,则会发生此错误 public class MyClass { internal MyClass() { } } namespace MyNamespace { class Program { st

我注意到编译器错误,当我错误地尝试实例化一个特殊类时,类型“…”没有定义构造函数

这让我想知道,当有人试图实例化时,我将如何编写自己的类来加速这条消息

下面的代码,我需要对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()
      {
      }
   }
}

我相信您需要将类的构造函数设置为内部,以便使其抛出此异常。我相信您还需要该类存在于另一个程序集中

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,调用方确实可以驻留在具有相同名称的命名空间中,但这不会改变任何事情。构造函数仍然是内部的,内部边界是程序集,而不是名称空间。谢谢让乔恩·斯基特想出一个晦涩难懂的重述案例:谢谢。不过,名称空间并不能做到这一点。“我相信一定是大会。”詹姆斯,谢谢你的更新。我将从我的答案中删除该部分。谢谢,这解决了我的问题。注意:如果您在继承类而不是直接实例化类时看到此错误,请参阅