我猜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);
}
}
如果您不想這樣做,那麼打壓如不被應用反正它警告只是刪除代碼合同。
UPDATE
這是一個測試用例似乎是工作。
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));
}
}
}
這是否在做與您的情況不同的事情?
該接口是由DotNet框架提供的,所以我不認爲我可以採用添加合同類的方法。 –
您使用的是什麼版本的代碼合同,並且您有repro?我會盡快更新我的答案,用一個適合我的測試案例,但看起來我可能會錯過一些東西。 – Mightymuke