Я экспериментирую с .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));
Я что-то не так делаю, или это ошибка в бинарном переписывающем устройстве? Что я могу с этим поделать?