当ContractFor在不同的程序集上时,C#的代码约定不起作用

Pad*_*don 6 .net c# visual-studio-2010 code-contracts

我正在尝试使用ContractClass和定义接口的代码合同ContractClassFor.当一切都在同一个程序集中时,它工作正常,但是如果我将接口定义及其各自的契约类放在不同的程序集中,那么具体的类实现,它就不再起作用了.

例如,此代码有效:

namespace DummyProject
{
    [ContractClass(typeof(AccountContracts))]
    public interface IAccount
    {
        void Deposit(double amount);
    }

    [ContractClassFor(typeof(IAccount))]
    internal abstract class AccountContracts : IAccount
    {
        void IAccount.Deposit(double amount)
        {
            Contract.Requires(amount >= 0);
        }
    }

    internal class Account : IAccount
    {
        public void Deposit(double amount)
        {
            Console.WriteLine(amount);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Account account = new Account();
            // Contract.Requires will be checked below
            account.Deposit(-1);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我有一个单独的项目,具有以下内容:

namespace SeparateAssembly
{
    [ContractClass(typeof(SeparateAssemblyAccountContracts))]
    public interface ISeparateAssemblyAccount
    {
        void Deposit(double amount);
    }

    [ContractClassFor(typeof(ISeparateAssemblyAccount))]
    internal abstract class SeparateAssemblyAccountContracts 
        : ISeparateAssemblyAccount
    {
        void ISeparateAssemblyAccount.Deposit(double amount)
        {
            Contract.Requires(amount >= 0);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我写的话,那么在主项目(上面的不同组件)中:

namespace DummyProject
{
    internal class AccountFromSeparateAssembly 
        : ISeparateAssemblyAccount
    {
        public void Deposit(double amount)
        {
            Console.WriteLine(amount);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            ISeparateAssemblyAccount accountFromSeparateAssembly = 
                    new AccountFromSeparateAssembly();

            // Neither of the two statements below will work
            // Contract.Requires will be ignored
            accountFromSeparateAssembly.Deposit(-1);

            ((AccountFromSeparateAssembly)accountFromSeparateAssembly).Deposit(-1);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后Contract.Requires不再检查Deposit方法.

请问有什么想法吗?非常感谢!

Pad*_*don 2

我设法通过在包含和 的项目的代码合同设置中选择Contract Reference Assembly=来使其工作。BuildISeparateAssemblyAccountSeparateAssemblyAccountContracts