在委托中使用'base'关键字会导致System.BadImageFormatException

时间:2011-03-13 16:04:26

标签: c#-4.0

我有一个奇怪的问题,我想如果有人可以告诉我为什么会发生这种情况。我在基本抽象类中有一个受保护的方法,如下所示:

protected T ForExistingEntity<T>(TEntity entity, object key, Func<Entity, T> action) {
    entity = GetByKey(key);
    if (entity != null)
        return action(entity);

    return default(T); 
}

我从继承课程的原始电话如下:

return base.ForExistingEntity(
    new MyEntity(), key, e => {
        e.someFiled = 5;
        return base.Update(e);
    }
);

执行此代码时,会在以下行中引发异常:

return action(entity);

在基础抽象类中。例外是:

System.BadImageFormatException:尝试加载格式不正确的程序。 (HRESULT异常:0x8007000B)

现在我修改我的电话如下:

return base.ForExistingEntity(
    new MyEntity(), key, e => {
        e.someFiled = 5;
        return Update(e);
    }
);

它正常运行而没有任何问题。

修改

Update方法位于基本抽象类中,如下所示:

public virtual bool Update(TEntity entity) {
    Condition.Requires(entity, "entity")
        .IsNotNull();

    if (ValidateEntity(entity))
        return Update(entity, true);

    return false;
}

我开始认为这是因为Update是虚拟的并且调用实际上源自基类本身?无论如何,例外情况不是很有用。

2 个答案:

答案 0 :(得分:8)

这似乎是一个known C# compiler bug,涉及从泛型类中的匿名方法调用基本虚方法。如果你想解决它,请不要犹豫,在连接上提出这个错误。幸运的是,解决方法非常简单。

答案 1 :(得分:0)

我有同样的问题。我安装了.NET 4.5框架。当我卸载它并替换为.NET 4.0框架时,这个问题就消失了(即当我查看VS2010信息的右上角时是4.0.30319)