2010-09-04 7 views
7

Le code suivant me donne l'avertissement Contract class 'FooContracts' should be an abstract class. De tous les exemples que j'ai lus en ligne (par exemple http://www.infoq.com/articles/code-contracts-csharp), cela devrait fonctionner (vraisemblablement sans les avertissements du compilateur).La classe de contrat doit être une classe abstraite

[ContractClass(typeof(FooContracts))] 
public interface IFoo { 
    void Bar(string foo); 
} 

[ContractClassFor(typeof(IFoo))] 
internal sealed class FooContracts : IFoo { 
    void IFoo.Bar(string foo) { 
    Contract.Requires(foo != null); 
    } 
} 

Je suis dans Visual Studio 2010, avec les paramètres suivants dans la section Code Contracts des propriétés du projet:

  • Effectuer exécution du contrat Vérification (ensemble à Full)
  • Effectuer contrat Vérification statique (sous Static Checking)
  • Enregistrement en arrière-plan

J'ai également défini le symbole de compilation CONTRACTS_FULL pour que ReSharper se taise. Est-ce que je manque quelque chose pour faire cette compilation sans avertissements?

Répondre

9

Section 2.8 du code contracts manual stipule expressément qu'il doit être une classe abstraite:

Les outils attendent à ce que la classe du contrat est abstraite et implémente l'interface, il fournit des contrats pour .

+1

huh. Merci pour le lien. ce fait n'a jamais été mentionné ni démontré dans un exemple de code que j'ai trouvé. – tmont

3

L'article InfoQ auquel vous faites référence est probablement incorrect. Il est basé sur une édition "Accès anticipé" de C# en profondeur, donc l'implémentation des contrats de code a probablement changé entre le moment où le chapitre/article a été écrit à l'origine et la sortie de .NET 4.

Le code suivant devrait fonctionner:

[ContractClass(typeof(FooContracts))] 
public interface IFoo { 
    void Bar(string foo); 
} 

[ContractClassFor(typeof(IFoo))] 
internal abstract class FooContracts : IFoo { 
    void IFoo.Bar(string foo) { 
    Contract.Requires(foo != null); 
    } 
} 

La classe contrat doit être abstraite.

+0

Mais rendre le résumé de la classe signifie que vous ne pouvez pas le créer après l'implémentation de l'interface :(Toute alternative autour de cela? Autre que la création d'une nouvelle classe concrète héritant de la classe abstraite? – bitek

+1

@MnemonicFlow Vous ne devez pas créer d'instances de la classe de contrat de toute façon.Elle est seulement pour l'utilisation par le moteur de contrats de code. – piedar

Questions connexes