Это ошибка в переписывающем кодексе? - PullRequest
4 голосов
/ 23 августа 2010

Я экспериментирую с .NET Code Contracts. Следующий код работает нормально, когда проверка контракта во время выполнения выключена off , но завершается неудачно, если проверка контракта во время выполнения включена on :

using System.Collections.Generic;
using System.Diagnostics.Contracts;

namespace ConsoleApplication1
{
    public class Item<T> where T : class { }
    public class FooItem : Item<FooItem> { }

    [ContractClass(typeof(ITaskContract<>))]
    public interface ITask<T> where T : Item<T>
    {
        void Execute(IEnumerable<T> items);
    }

    [ContractClassFor(typeof(ITask<>))]
    internal abstract class ITaskContract<T> : ITask<T> where T : Item<T>
    {
        void ITask<T>.Execute(IEnumerable<T> items)
        {
            Contract.Requires(items != null);
            Contract.Requires(Contract.ForAll(items, x => x != null));
        }
    }

    public class FooTask : ITask<FooItem>
    {
        public void Execute(IEnumerable<FooItem> items) { }
    }

    class Program
    {
        static void Main(string[] args)
        {
            new FooTask();
        }
    }
}

Ошибка, возникающая при запуске этого кода, не является нарушением договора. Скорее, похоже, что программа перезаписи как-то генерирует испорченный двоичный файл:

Необработанное исключение: System.BadImageFormatException: была предпринята попытка загрузить программу с неверным форматом. (Исключение из HRESULT: 0x8007000B) в ConsoleApplication1.Program.Main (String [] args)

Ошибка исчезнет, ​​если я удалю следующую строку:

Contract.Requires(Contract.ForAll(items, x => x != null));

Я что-то не так делаю, или это ошибка в бинарном переписывающем устройстве? Что я могу с этим поделать?

1 Ответ

1 голос
/ 27 августа 2010

Это подтвержденная ошибка в переписывающем устройстве:

http://social.msdn.microsoft.com/Forums/en-US/codecontracts/thread/66410714-4475-45fb-b0db-50036463029e

...