0

I am implementing the System.IServiceProvider.GetService method and I cannot suppress the warning ... 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)
{
}
4

1 回答 1

0

我猜GetService是您在具体类中实现的接口中的方法,并且具体类中的方法包含合同。需要将此合同移动到为接口提供合同的合同类中。完整的详细信息可以在代码合同文档中找到(在第 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));
        }
    }
}

这是否与您的情况有所不同?

于 2013-01-02T22:06:36.530 回答