.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));
何か間違ったことをしているのですか、それともバイナリ リライタのバグですか? 私はそれについて何ができますか?