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));

何か間違ったことをしているのですか、それともバイナリ リライタのバグですか? 私はそれについて何ができますか?

4

1 に答える 1

1

これは、リライターで確認されたバグです。

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

于 2010-08-27T06:58:33.817 に答える