我在c#代码中遇到了一个模糊的运行时崩溃错误。从堆栈跟踪看来,有时很少会跳过覆盖,而是调用基类方法。伪代码如下所示:
public class Widget : Gear
{
public override string Spin()
{
return "crunch";
}
}
public class Gear
{
public virtual string Spin()
{
return "whirr";
}
}
如果我这样称呼一千次,就像这样:
var widget = new Widget();
for (var i = 0; i < 1000; i++)
{
Console.WriteLine(widget.Spin());
}
我可能会在一次迭代中调用基类:
> ...
> crunch
> crunch
> crunch
> whirr
> crunch
> ...
现在我的实际场景是使用Entity Framework,并且错误发生在EntityContext.SaveChanges()方法中,因为我的覆盖中的某些内容没有发生,并且堆栈跟踪显示覆盖被跳过,但上面的代码是代表性的症状。
我的问题是:(1)这可能吗? (2)可以预防吗?
答案 0 :(得分:5)
您的Gear类需要将Spin函数标记为虚拟:
class Gear {
public virtual string Spin() {
return "whirr";
}
}
在我的测试中,我得到了1000英寸的“仰卧起坐”。
如果您的EntityContext.SaveChanges()
方法中发生了这种情况,那么遗憾的是,发布的代码无法代表问题。
答案 1 :(得分:0)
旋转类齿轮的方法需要标记为虚拟,实际上我很惊讶这个编译
我的测试(设置为虚拟)工作正常