这是Code Contracts重写器中的一个bug吗?

4
我正在尝试使用.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));

我是否做错了什么,还是二进制重写器存在漏洞?我该怎么办?


我正在一台32位x86机器上运行此程序。我已经尝试在构建配置中设置平台目标为“x86”和“任何CPU”,但无论哪种方式都得到了相同的结果。我还没有尝试在x64机器上运行此程序。 - Jim Killingsworth
1
我看到了相同的结果。Win7 Prof 64位 + VS 2010 Ultimate,Code Contracts 1.4.30707.2。它仍处于开发阶段,因此可能会有一些错误。 - Tomas Voracek
1
我建议您在CC论坛上报告此问题,网址为:http://social.msdn.microsoft.com/Forums/en/codecontracts/threads - porges
网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接