6
votes

Surcharge de l'opérateur en méthodes génériques

Cet extrait de code est de c # en profondeur xxx pré>

la sortie de l'extrait de code ci-dessus est p> xxx pré>

lorsque la méthode principale est Changé en P>

True 
True


1 commentaires

N'oubliez pas que génériques ne sont pas modèles . Le compilateur surcharge une résolution sur l'opérateur == une fois que chaque construction générique utilise le résultat de cette analyse. Nous ne faisons aucune analyse pour comparer et une autre pour comparer et un tiers pour comparer . Nous faisons l'analyse une fois. Lors de la comparaison t à T où T est connu pour être une classe, la seule chose que nous pouvons faire est de faire == signifie "comparer par référence". Donc, cela signifie toujours "comparer par référence", peu importe ce que T est.


3 Réponses :


5
votes

a appris une nouvelle chose aujourd'hui.

Je suppose que Jon a dit dans l'une des questions, j'ai essayé de répondre.

Lorsque vous construisez une chaîne à l'aide de la concaténation, == Retournera true pour 2 chaînes de valeur correspondante, mais elles ne signalent pas la même référence (que je pensais, elle devrait être due à une chaîne interne. JON a pointé que la chaîne interne fonctionne. pour constants ou littéraux).

dans la version générique, il appelle l'objet.Refereferequens (qui est différent de ==. En cas de chaîne, == Comparaison de valeur).

En conséquence, la version concaténée renvoie false alors que la version constante (chaîne littérale) renvoie true.

Edit: Je pense que Jon doit être là pour expliquer cela de manière bien meilleure :)
Paresseux moi, j'ai acheté le livre mais je n'ai pas encore commencé à commencer dessus. : (


1 commentaires

Pas besoin de moi de l'expliquer moi-même - Marc a fait un excellent travail :) (et votre explication est bien aussi).



13
votes

Sur le cas des chaînes, vous n'avez probablement pas l'intention d'utiliser l'égalité de référence. Pour accéder à l'égalité et aux inégalités des méthodes génériques, votre meilleur pari:

    string name = "Jon";
    string intro1 = "My name is " + name;
    string intro2 = "My name is " + name;
    Console.WriteLine(intro1 == intro2);
    Console.WriteLine(AreReferencesEqual(intro1, intro2));


1 commentaires

@MARC: Merci, ça a été succinct



2
votes

Cela n'a rien à voir avec la méthode générique, mais l'instanciation des chaînes

dans la première version de la principale que vous avez: xxx

qui crée 4 cordes. Deux d'entre elles compilent des constantes de temps à savoir "Jon" et "Mon nom" sont "" Toutefois, lors de l'initialisation d'Intro1 et d'Intro2, le compilateur ne peut pas dire que le nom est toujours jon et résout la valeur d'exécution de la valeur faisant une nouvelle chaîne pour chacune d'intro1 et d'intro2.

dans la deuxième version xxx

Vous n'avez qu'une seule chaîne et c'est une constante de temps de compilation: "Mon nom est Jon" et vous affectez cette chaîne à la fois intro1 et intro2 et c'est pourquoi xxx

renvoie false dans le premier cas et vrai dans la seconde


0 commentaires