2010-05-23 8 views
1

Le code ci-dessous fait exploser ccrewrite! Des idées? BTW, Si vous commentez le ActualClass, ccrewrite ...CodeContracts: ccrewrite échoue avec la référence d'objet non définie sur une instance d'un objet

réussit
[ContractClass(typeof(TestContracts))] 
    interface ITestInterface 
    { 
     bool IsStarted { get; set; } 
     void Begin(); 
    } 

    class ActualClass : ITestInterface 
    { 
     public bool IsStarted { get; set; } 
     public void Begin() 
     { 
      this.IsStarted = true; 
     } 
    } 

    [ContractClassFor(typeof(ITestInterface))] 
    class TestContracts : ITestInterface 
    { 
     ITestInterface Current { get; set; } 

     private TestContracts() 
     { 
      Current = this; 
     } 

     #region ITestInterface Members 

     bool ITestInterface.IsStarted 
     { 
      get; set; 
     } 

     void ITestInterface.Begin() 
     { 
      Contract.Requires(!Current.IsStarted); 
      Contract.Ensures(Current.IsStarted); 
     } 

Merci à l'avance!

Répondre

1

Eh bien, est bonne pour ne pas lire Jon Skeet assez bien;) Le peu sur la façon dont rewriter prend les contrats et les met dans votre classe réelle ...

[ContractClassFor(typeof(ITestInterface))] 
    class TestContracts : ITestInterface 
    { 

     private TestContracts() 
     { 
     } 

     #region ITestInterface Members 

     bool ITestInterface.IsStarted 
     { 
      get; set; 
     } 

     void ITestInterface.Begin() 
     { 
      ITestInterface iface = this; 
      Contract.Requires(!iface.IsStarted); 
      Contract.Ensures(iface.IsStarted); 
     } 
    } 

http://social.msdn.microsoft.com/Forums/en-US/codecontracts/thread/853227bf-56e6-427b-8e9e-162c129e87ce/