inheritance一个没有任何构造函数的抽象类

我想从另一个类inheritance一个类,标记为抽象,没有定义任何构造函数。

这是我的代码:

// 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网站( 抽象(C#参考)第一个例子)上看到,inheritance一个没有构造函数的抽象类是可能的。 那么,有谁知道我为什么会收到这个错误?

请注意,当类型与Message类位于同一个DLL中时,可以inheritance,并且它可以作为该程序集公开从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) {} } } 

我也检查了类型’…’没有定义构造函数 ,但它没有谈论inheritance,而只是新建一个实例,我显然没有期望直接实例化一个抽象类的实例。

如果您看不到Message类的任何实例构造函数(通常是因为它们都是private并且您在类之外,或者它们都是privateinternal并且您在程序集之外),则不能编写inheritance的类来自Message 。 (好吧,你可以创建两个实例构造函数,它们使用:this(...)语法循环链接,但这没有用)。

请注意,当您查看“元数据”(为您引用的程序集生成的reflection生成的伪C#)时,通常只能看到“可见”成员,因此任何privateinternal成员都不会显示。 我认为你看一下元数据是因为我们看到了非抽象(和非外部)的方法,这些方法缺少了主体(只有一个分号;而不是一个主体{ ... } )。

您的Message类的源代码将具有一个或多个构造函数,每个构造函数都是privateinternal ,但是当从程序集外部看时,这些构造函数是“不存在的”。

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

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

 public abstract class Message { // note: zero non-static constructors here } 

它将完全编译,就像它说:

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

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

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

(如果没有显式指定要调用的基类构造函数,则会从派生类中自动调用基类的默认构造函数,因此可能不会明白是否正在调用基类构造函数。)

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

 public class Base { internal Base() { } } 

一个不同的程序集执行此操作:

 class Derived: Base { public Derived() { } } 

您将看到以下编译错误:

The type 'ClassLibrary1.Base' has no constructors defined