Использование ключевого слова base в делегате вызывает System.BadImageFormatException - PullRequest
5 голосов
/ 13 марта 2011

У меня странная проблема, и я хотел бы, чтобы кто-нибудь мог объяснить мне, почему это происходит.У меня есть защищенный метод в базовом абстрактном классе, как показано ниже:

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 ]

8 голосов
/ 13 марта 2011

Кажется, это известная ошибка компилятора C # , связанная с вызовом базового виртуального метода из анонимного метода в универсальном классе.Не стесняйтесь объявить эту ошибку на Connect, если вы хотите, чтобы она была решена.К счастью, обходной путь здесь довольно прост.

0 голосов
/ 18 октября 2012

У меня была такая же проблема.У меня была установлена ​​платформа .NET 4.5.Когда я удалил это и заменил на .NET 4.0 framework, эта проблема исчезла (т.е. 4.0.30319, когда я смотрю в верхний правый угол моей информации о VS2010)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...