我正在尝试使用.NET代码合同。当运行时的合同检查被关闭时,以下代码可以正常运行,但当运行时的合同检查被打开时,则失败:
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));
我是否做错了什么,还是二进制重写器存在漏洞?我该怎么办?