我猜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));
}
}
}
这是否与您的情况有所不同?