C# 继承没有任何构造函数的抽象类

C# 继承没有任何构造函数的抽象类,c#,inheritance,constructor,abstract-class,C#,Inheritance,Constructor,Abstract Class,我想从另一个没有定义任何构造函数的类(标记为抽象)继承一个类 这是我的代码: // In one assembly (TheMessage.dll), as seen via F12 in VS (from Metadata) namespace Namespace1 { public abstract class Message { public string Body { get; set; } // some abstract methods

我想从另一个没有定义任何构造函数的类(标记为抽象)继承一个类

这是我的代码:

// In one assembly (TheMessage.dll), as seen via F12 in VS (from Metadata)
namespace Namespace1 
{
    public abstract class Message
    {
       public string Body { get; set; }
       // some abstract methods here, not shown.
    }
}

// In another assembly (TheUser.dll)
namespace Namespace2
{
    public class MyMessage : Namespace1.Message
    {
         public MyMessage()
         {
         }
    }
}
问题是在
public MyMessage()
构造函数上我得到了错误

类型“Namespace1.Message”未定义构造函数

我在MSDN站点(第一个示例)上看到,不使用构造函数继承抽象类是可能的。有人知道我为什么会犯这个错误吗

请注意,当type与Message类位于同一DLL中,并且该程序集公开从
Namespace1派生的一些其他类型时,可以很好地继承。Message
类似于以下内容:

// The same assembly  as Message (TheMessage.dll), as seen via F12 in VS (from Metadata)
namespace Namespace3
{
    public class Message : Namespace1.Message
    {
        public Message() {}
        public Message(string to) {}
    }
}


我也检查过了,但它并没有谈到继承,只是新创建了一个实例,我显然不希望直接实例化一个抽象类的实例。

您可能有一个内部构造函数(您发布的代码中没有显示)并尝试从不同的程序集中使用内部构造函数实例化该类

(如果未显式指定要调用的基类构造函数,则会从派生类自动调用基类的默认构造函数,因此调用基类构造函数对您来说可能并不明显。)

例如,如果一个程序集包含此类(在命名空间
ClassLibrary1
内):

另一个程序集执行以下操作:

class Derived: Base
{
    public Derived()
    {
    }
}
您将看到以下编译错误:


如果
消息
类的实例构造函数对您都不可见(通常是因为它们都是
私有的
而您在类之外,或者它们都是
私有的
内部的
而您在程序集之外),则类型“ClassLibrary1.Base”没有定义构造函数,不能编写从
消息继承的类。(好吧,您可以创建两个实例构造函数,它们使用
循环地相互链接:这(…)
语法,但这并没有用)

请注意,当您查看“元数据”(为您引用的程序集生成的反射伪C)时,通常只会看到“可见”成员,因此任何
private
internal
成员都不会显示。我认为您查看元数据是因为我们看到没有实体的非抽象(和非外部)方法(只有分号
而不是实体
{…}

消息
类的源代码将有一个或多个构造函数,每个构造函数都是
私有的
内部的
,但从程序集外部看,这些构造函数“不存在”

如果非静态C#class
Message
的源代码不包含实例构造函数,编译器将自动生成一个实例构造函数。如果类是具体的(即非抽象的),则它将是一个
公共的
无参数构造函数;如果类是抽象的,则它将是一个
受保护的
构造函数

这意味着如果源代码如下所示:

public abstract class Message
{
  // note: zero non-static constructors here
}
它将完全按照它所说的那样进行汇编:

public abstract class Message
{
  protected Message()
  {
  }
}

在这种情况下,从
消息
派生的所有类都可以访问生成的实例构造函数

您确定它没有内部构造函数吗?
消息
是您自己的代码吗?看见另外,正如@xxMUROxx所指出的,您发布的代码是无效的。最后三个方法应该有修饰符
abstract
,这不是实际的代码,所以很难说出什么问题……当您尝试实例化具有内部或私有构造函数的类时,调用方看不到该类,就会发生此错误。您发布的代码不包括呼叫代码。您可能想创建一个简单的控制台程序,并将代码粘贴到您的问题中,任何人都可以尝试重现错误。@Adamhuldsworth
消息
类不是我的。它来自一个DLL,因此我无法修改它。同一DLL中有另一个类继承了
消息
类。我添加了这个类的代码。
public abstract class Message
{
  protected Message()
  {
  }
}