由于保密协议,我试图使用大量文献不完善的API,因此我无法真正说出它,因此我在描述问题时会使用一些虚构的名称。
当我尝试使用简单的var thing = new CustomThingInstance();
创建一些自定义对象的实例时,编译器会发出CS1729错误(“ CustomThingInstance”不包含带有0个参数的构造函数)。
从API的元数据中,我得到了与我的问题相关的类的以下声明:
public abstract class Thing
{
protected Thing();
protected Thing(object reference);
protected object Reference { get; set; }
}
public abstract class ThingWithTimeZone : Thing
{
protected ThingWithTimeZone();
protected ThingWithTimeZone(object reference);
public TimeZoneInfo SourceTimeZone { get; set; }
}
public class CustomThingInstance : ThingWithTimeZone
{
public int Id { get; set; }
public string Message { get; set; }
}
我的第一个想法是CustomThingInstance可能正在继承ThingWithTimeZone的默认构造函数的“保护性”,但是,如果我通过复制接口并在需要的地方提供虚拟实现来复制该类结构,那么...
public abstract class MyThing
{
protected MyThing() { }
protected MyThing(object reference) { }
protected object Reference { get; set; }
}
public abstract class MyThingWithTimeZone : MyThing
{
protected MyThingWithTimeZone() : base() { }
protected MyThingWithTimeZone(object reference) : base(reference) { }
public TimeZoneInfo SourceTimeZone { get; set; }
}
public class MyCustomThingInstance : MyThingWithTimeZone
{
public int Id { get; set; }
public string Message { get; set; }
}
...然后我可以毫无问题地调用其默认构造函数:
var myThing = new MyThingCustomInstance(); // No CS1729 here
我已经通过反射检查了原始类型的构造函数,发现有2个签名与基类中的两个构造函数的签名匹配(一个不带参数,另一个带参数类型的Object)。在这两种情况下,ConstructorInfo.IsPrivate
都是错误的,因此在我看来应该有一个可以从外部访问的无参数构造函数。
有人可以解释为什么不是这种情况吗?