2012-12-26 31 views
0

我實現了System.IServiceProvider.GetService方法,我無法抑制警告... implements interface method 'System.IServiceProvider.GetService(System.Type)', thus cannot add Requires.爲什麼不應用CC1033消息抑制?

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

回答

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); 
    } 
} 

如果您不想這樣做,那麼打壓如不被應用反正它警告只是刪除代碼合同。

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)); 
     } 
    } 
} 

這是否在做與您的情況不同的事情?

+0

該接口是由DotNet框架提供的,所以我不認爲我可以採用添加合同類的方法。 –

+0

您使用的是什麼版本的代碼合同,並且您有repro?我會盡快更新我的答案,用一個適合我的測試案例,但看起來我可能會錯過一些東西。 – Mightymuke