2010-03-12 15 views
8

Dobry wieczór,Kontrakty kodu z interfejsów: „Metoda Inwokacja pomijane kompilator wygeneruje wywołania metody, ponieważ metoda jest uzależniona ... [...]”.

Właśnie zaczął grać z Microsoft.Contracts (najnowszą wersję) i podłączając go w górnej części interfejsu próbki i teraz wygląda to tak:

namespace iRMA2.Core.Interfaces 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.ComponentModel.Composition; 
    using System.Diagnostics.Contracts; 

    /// <summary> 
    /// Base Interface declarations for iRMA2 Extensions 
    /// </summary> 
    [InheritedExport] 
    [ContractClass(typeof(IiRMA2ExtensionContract))] 
    public interface IiRMA2Extension 
    { 
     /// <summary> 
     /// Gets the name. 
     /// </summary> 
     /// <value>The name of the Extension.</value> 
     string Name { get; } 

     /// <summary> 
     /// Gets the description. 
     /// </summary> 
     /// <value>The description.</value> 
     string Description { get; } 

     /// <summary> 
     /// Gets the author of the extension. Please provide complete information to get in touch with author(s) and the corresponding department 
     /// </summary> 
     /// <value>The author of the extensions.</value> 
     string Author { get; } 

     /// <summary> 
     /// Gets the major version. 
     /// </summary> 
     /// <value>The major version of the extension.</value> 
     int MajorVersion { get; } 

     /// <summary> 
     /// Gets the minor version. 
     /// </summary> 
     /// <value>The minor version.</value> 
     int MinorVersion { get; } 

     /// <summary> 
     /// Gets the build number. 
     /// </summary> 
     /// <value>The build number.</value> 
     int BuildNumber { get; } 

     /// <summary> 
     /// Gets the revision. 
     /// </summary> 
     /// <value>The revision.</value> 
     int Revision { get; } 

     /// <summary> 
     /// Gets the depends on. 
     /// </summary> 
     /// <value>The dependencies to other <c>IiRMA2Extension</c> this one has.</value> 
     IList<IiRMA2Extension> DependsOn { get; } 
    } 

    /// <summary> 
    /// Contract class for <c>IiRMA2Extension</c> 
    /// </summary> 
    [ContractClassFor(typeof(IiRMA2Extension))] 
    internal sealed class IiRMA2ExtensionContract : IiRMA2Extension 
    { 
     #region Implementation of IiRMA2Extension 

     /// <summary> 
     /// Gets or sets the name. 
     /// </summary> 
     /// <value>The name of the Extension.</value> 
     public string Name 
     { 
      get 
      { 
       Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<string>())); 
       return default(string); 
      } 

      set 
      { 
       Contract.Requires(value != null); 
      } 
     } 

     /// <summary> 
     /// Gets the description. 
     /// </summary> 
     /// <value>The description.</value> 
     public string Description 
     { 
      get { throw new NotImplementedException(); } 
     } 

     /// <summary> 
     /// Gets the author of the extension. Please provide complete information to get in touch with author(s) and the corresponding department 
     /// </summary> 
     /// <value>The author of the extensions.</value> 
     public string Author 
     { 
      get { throw new NotImplementedException(); } 
     } 

     /// <summary> 
     /// Gets the major version. 
     /// </summary> 
     /// <value>The major version of the extension.</value> 
     public int MajorVersion 
     { 
      get { throw new NotImplementedException(); } 
     } 

     /// <summary> 
     /// Gets the minor version. 
     /// </summary> 
     /// <value>The minor version.</value> 
     public int MinorVersion 
     { 
      get { throw new NotImplementedException(); } 
     } 

     /// <summary> 
     /// Gets the build number. 
     /// </summary> 
     /// <value>The build number.</value> 
     public int BuildNumber 
     { 
      get { throw new NotImplementedException(); } 
     } 

     /// <summary> 
     /// Gets the revision. 
     /// </summary> 
     /// <value>The revision.</value> 
     public int Revision 
     { 
      get { throw new NotImplementedException(); } 
     } 

     /// <summary> 
     /// Gets the Extensions this one depends on. 
     /// </summary> 
     /// <value>The dependencies to other <c>IiRMA2Extension</c> this one has.</value> 
     public IList<IiRMA2Extension> DependsOn 
     { 
      get 
      { 
       Contract.Ensures(Contract.Result<IList<IiRMA2Extension>>() != null); 
       return default(IList<IiRMA2Extension>); 
      } 
     } 

     #endregion 
    } 
} 

teraz dlaczego są dwa Contract.Ensures (...) „blured” się wizualnie z podpowiedzi mówiąc: "Metoda Inwokacja została pominięta Kompilator wygeneruje wywołanie metody, ponieważ metoda jest warunkowa lub jest metodą częściową bez implementacji "iw rzeczywistości dane wyjściowe CodeContracts nie liczą/nie pokazują ... Czego mi brakuje & robi źle tutaj?

-J

Odpowiedz

12

Czy masz odpowiednie makra kontraktu kodu zdefiniowane dla tej kompilacji? Na przykład CONTRACTS_FULL? Niewłaściwe zdefiniowanie makr może spowodować wykluczenie metod z kompilacji.

+4

@ Jörg B .: Myślę, że używasz Resharpera. Resharper nie wie, że CONTRACTS_FULL zostanie zdefiniowany podczas kompilacji, chyba że umieścisz go w "warunkowych symbolach kompilacji" dla projektu. To powinno naprawić ... ale ma tę wadę, że będziesz musiał zmienić zarówno stronę * jak i * Kontraktów kodowych, jeśli zmienisz poziom Umów, z których korzystasz. – porges

+2

@Porges: yep yep. Dodatkowo stworzyłem raport o błędzie po raz za r # at http://youtrack.jetbrains.net/issue/RSRP-182553 dla R # do obsługi kontraktów kodu natywnie dla jego sugestii/ostrzeżeń refaktoryzacji kodu. –

+0

404 http://emberapp.com/joergbattermann/images/code-contracts/sizes/m.png nie znaleziono. –

Powiązane problemy