为什么不应用CC1033消息抑制?

时间:2012-12-26 19:41:38

标签: code-contracts

我正在实施System.IServiceProvider.GetService方法,我无法取消警告... implements interface method 'System.IServiceProvider.GetService(System.Type)', thus cannot add Requires.

[SuppressMessage("Microsoft.Contracts","CC1033", Justification="Check to require service type not null cannot be applied")]
public object GetService(Type serviceType)
{
}

1 个答案:

答案 0 :(得分:0)

我猜测GetService是一个接口中的一个方法,你已经在一个具体的类中实现了,并且具体类中的方法包含一个契约。需要将此合同移动到提供接口合同的合同类。有关详细信息,请参阅code contracts documentation(第2.8节)。以下是摘录:

  

由于大多数语言/编译器(包括C#和VB)都不允许您将方法体放在接口中,因此编写接口方法的合同需要创建一个单独的合同类来保存它们。

     

接口及其合约类通过一对属性链接(第4.1节)。

[ContractClass(typeof(IFooContract))]
interface IFoo
{
    int Count { get; }
    void Put(int value);
}

[ContractClassFor(typeof(IFoo))]
abstract class IFooContract : IFoo
{
    int IFoo.Count
    {
        get
        {
            Contract.Ensures( 0 <= Contract.Result<int>() );
            return default( int ); // dummy return
        }
    }
    void IFoo.Put(int value)
    {
        Contract.Requires( 0 <= value );
    }
}

如果您不想这样做,那么要取消警告,只需删除代码合同,因为它仍未被应用。

<强>更新

这是似乎正在运行的测试用例。

namespace StackOverflow.ContractTest
{
    using System;
    using System.Diagnostics.Contracts;

    public class Class1 : IServiceProvider
    {
        public object GetService(Type serviceType)
        {
            Contract.Requires<ArgumentNullException>(
                serviceType != null,
                "serviceType");
            return new object();
        }
    }
}

namespace StackOverflow.ContractTest
{
    using System;

    using NUnit.Framework;

    [TestFixture]
    public class Tests
    {
        [Test]
        public void Class1_Contracts_AreEnforced()
        {
            var item = new Class1();
            Assert.Throws(
                Is.InstanceOf<ArgumentNullException>()
                    .And.Message.EqualTo("Precondition failed: serviceType != null  serviceType\r\nParameter name: serviceType"),
                () => item.GetService(null));
        }
    }
}

这是否与您的方案有所不同?