我正在实施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)
{
}
答案 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));
}
}
}
这是否与您的方案有所不同?