首先,为什么在C#中调用ctor中的虚函数不是一个错误?
其次,如果允许的话,为什么Resharper仍然会对此发出警告?
答案 0 :(得分:3)
已经回答:
Virtual member call in a constructor
简而言之,它与调用构造函数的顺序有关,这与调用虚方法的顺序不同:构造函数从较不具体到最特定的调用,而虚方法被称为从最具体到最不具体的。
这意味着你可以陷入这个陷阱:
public class Base {
protected virtual void DoSomething() {
// do nothing
}
public Base() {
DoSomething();
}
}
public class Another : Base {
private List<string> list;
public Another() {
list = new List<string>();
}
protected override void DoSomething() {
// this code will raise NullReferenceException,
// since this class' constructor was not run yet,
// still, this method was run, since it was called
// from the Base constructor
list.Add("something");
}
}
答案 1 :(得分:2)
至于为何不是错误,请从维基百科查看:
对于某些语言,特别是C ++, 虚拟调度机制有 不同的语义 建设和破坏 宾语。虽然建议 构造函数中的虚函数调用 对于C ++应该避免使用[3] 其他语言,例如Java和 C#,派生实现即可 在施工和设计期间调用 抽象工厂等模式 模式积极推动这种用法 支持这种能力的语言。
至于你问题的第二部分,ReSharper警告它,因为虽然你可能会被允许,但如果你不知道你在做什么,它会产生一些意想不到的结果。有关详细信息,请查看: