1

Je joue avec CodeContracts de Microsoft et j'ai rencontré un problème que j'étais incapable de résoudre. J'ai une classe avec deux constructeurs:CodeContracts: Comment remplir Fullfill Exiger dans Ctor en utilisant cet appel?

public Foo (public float f) { 
    Contracts.Require(f > 0); 
} 
public Foo (int i) 
    : this ((float)i) 
{} 

L'exemple est simplifié. Je ne sais pas comment vérifier f du second constructeur pour être> 0. Est-ce même possible avec Contrats?

+0

pourquoi voudriez-vous cela? appeler ceci ((float) i) vérifie déjà f> 0 – chiccodoro

Répondre

2

Vous pouvez simplement ajouter la condition préalable au corps du second constructeur.

public TestClass(float f) 
{ 
    Contract.Requires(f > 0); 
    throw new Exception("foo"); 
} 
public TestClass(int i): this((float)i) 
{ 
    Contract.Requires(i > 0); 
} 

EDIT

Essayez d'appeler le code ci-dessus:

TestClass test2 = new TestClass((int)-1); 

Vous verrez que la condition est levée avant que l'exception régulière est levée.

+0

Je suppose que la ligne que vous avez ajoutée ne sera évaluée qu'après que le constructeur float a déjà été appelé, n'est-ce pas? – chiccodoro

+1

@Chiccodoro: En fait, non. Je l'ai testé pour être sûr, et si vous voulez mettre une exception de lancement dans le corps du premier constructeur et appelez le second constructeur avec une entrée invalide, les Contrats de Code lanceraient une précondition échouée ("i> 0") avant que exception du premier constructeur. – koenmetsu

+0

Alors, est-ce que "Contrat" ​​dispose d'une extension de langage plutôt que d'une bibliothèque? Parce que normalement le constructeur de la classe de base est exécuté * avant * le constructeur de la sous-classe. – chiccodoro

1

Je voudrais ajouter une méthode statique qui convertit int en float et inclure le Contract.Requires dedans.

class Foo 
{ 
    public Foo(float f) 
    { 
     Contract.Requires(f > 0); 
    } 
    public Foo(int i) 
     : this(ToFloat(i)) 
    { } 

    private static float ToFloat(int i) 
    { 
     Contract.Requires(i > 0); 
     return i; 
    } 
} 

Espérons que cela aide.

Questions connexes