Paramètres strict

babe59 Messages postés 189 Date d'inscription vendredi 28 mai 2004 Statut Membre Dernière intervention 27 novembre 2015 - 2 mars 2015 à 12:08
Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 - 3 mars 2015 à 09:43
Bonjour,

j'ai une méthode qui accepte un Int64 en paramètre. Si je lui passe un Int32, la compile passe sans problème. J'aimerai plutôt avoir une erreur de compilation.
Que faut-il faire ?
Slts

4 réponses

Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 656
2 mars 2015 à 13:26
Bonjour
dans ce sens ça ne pose pas de problème 1 en 32 bits ou en 64 bits c'est 1.
Par exemple
            Int32 toto = 1234567890;
            test(toto);
        

        private void test(Int64 valeur)
        {
            Int64 v2 = valeur * 2;
        }


Si je mets un point d'arrêt dans test, valeur vaut bien 1234567890 (la conversion est implicite donc pas d'erreur), et v2 se calcule.

Par contre dans l'autre sens, il n'y a pas de conversion implicite car un int64 peut être trop grand pour rentrer tout seul dans un int32.
            Int64 toto = Int32.MaxValue;
            toto += 10;

            test(toto);//cette ligne est soulignée car ça ne veut pas précompiler

        private void test(Int32 valeur)
        {
            Int64 v2 = valeur * 2;
        }


Par contre si je caste en int32, ça compile mais le résultat est faux:
            Int64 toto = Int32.MaxValue;
            toto += 10;

            test((Int32)toto);
        }

        private void test(Int32 valeur)
        {
            Int64 v2 = valeur * 2;
        }

toto 2147483657 long
valeur -2147483639 int
0
babe59 Messages postés 189 Date d'inscription vendredi 28 mai 2004 Statut Membre Dernière intervention 27 novembre 2015
2 mars 2015 à 14:42
je suis d'accord, mon problème est que le paramètre en Int32 n'a pas le même sens que le paramètre en Int64 donc je ne veux pas de cette conversion implicite de Int32 en Int64

Pour être plus précis, j'avais un code du style


public class test
{
public test (Int32 PkClient)
{

}

public test (Int64 numClient)
{

}
}

J'ai du faire une migration et j'ai supprimé le constructeur avec le PkClient (Int32).
J'ai donc des programmes qui utilisent le constructeur avec le Int32 et d'autres avec le Int64. comme le constructeur Int32 n'existe plus, tous les appels au constructeur qui existent dans mes prog se
fait sur le Int64. Les programmes compilent donc toujours mais certains appels se font avec le PkClient pour le constructeur avec le In64
0
Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 656
2 mars 2015 à 18:37
Ha ok.
Peut être peux tu remettre un constructeur avec int32 et que celui ci génère une erreur.
Ça va compiler mais à l'exécution en mode debug ça va planter
0
babe59 Messages postés 189 Date d'inscription vendredi 28 mai 2004 Statut Membre Dernière intervention 27 novembre 2015
3 mars 2015 à 08:47
A défaut d'une autre réponse, j'appliquerai ton idée. au moins ça évitera un bug à l'exécution pour les méthode que j'aurai oublié de migrer
(je vais attendre avant de mettre "résolu" au cas où...
Merci
0
Whismeril Messages postés 19040 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 mai 2024 656
3 mars 2015 à 09:43
Bonjour une idée comme ça, pas testée.m

Tu crée une classe avec une conversion implicite depuis int64 mais pas int32.
Soit ça marche, soit ça va faire les deux conversion implicite 32 vers 64 et 64 vers ta classe.
Tu essayes de compiler et tu voies.
0
Rejoignez-nous