7
votes

Passer la valeur nulle à la méthode de surcharge de la surcharge où objet et chaîne comme param dans c #

J'ai deux méthodes surchargées telles que ci-dessous xxx

après avoir appelé cette méthode comme ci-dessous, elle affichera la sortie sous la forme Chargement de la chaîne ... Veuillez expliquer comment .net gérer ce scénario? xxx


2 commentaires

Ici lippert l'explique pour les constructeurs: Stackoverflow.com/a/5174773/613130 ​​


Si vous souhaitez appeler l'autre surcharge, utilisez obj.loadtest ((objet) null); .


4 Réponses :


2
votes

Parce que le compilateur prend la méthode spécifique la plus proche possible que possible (NULL à String est plus proche que NULL à l'objet) disponible. Et dans ce cas que la surcharge avec la chaîne est plus proche, c'est pourquoi il est appelé.

C'est ce que MSDN Doit dire

Une fois que les membres de la fonction candidat et la liste d'arguments ont été identifiés, la sélection du meilleur membre de la fonction est la même dans Tous les cas:

  1. Compte tenu de l'ensemble des membres de la fonction candidat applicables, le meilleur élément de fonction de cet ensemble est situé.

  2. Si l'ensemble contient un seul élément de fonction, cet élément de fonction est le meilleur élément de fonction.

  3. sinon, le meilleur membre de la fonction est le membre de la fonction qui est meilleur que tous les autres membres de la fonction par rapport à la donnée. Liste des arguments, à condition que chaque membre de la fonction soit comparé à tous Autres membres de la fonction utilisant les règles de la section 7.4.2.2.

  4. S'il n'y a pas exactement un membre de la fonction meilleur que tous les autres membres de la fonction, l'invocation des membres de la fonction est une erreur ambiguë et une erreur de compilation se produit.


0 commentaires

4
votes

null est une chaîne de code valide .

Il tentera de faire correspondre le type le plus spécifique et string est plus spécifique que objet

Selon votre utilisation, vous devez probablement supprimer le paramètre totalement dans l'objet surcharge.


0 commentaires

5
votes

Le compilateur C # prend la surcharge la plus spécifique possible.

comme chaîne est un objet , et il peut avoir la valeur de null , le compilateur juge chaîne être plus précis.


2 commentaires

Voulez-vous dire que la chaîne est dérivée de la chaîne de la classe de base.so String a plus de priorité que l'objet.


@Jemi pas plus priorité ... comme string est un objet , mais il est plus précis, il pense (pas vraiment, les machines ne peuvent pas Pensez) "Bien, il y a deux méthodes. Le paramètre peut s'appliquer aux deux, mais string est plus spécifique que l'objet (comme chaîne est un objet Code>) Je vais donc résoudre cet appel à la chaîne surcharge. "



3
votes

Ceci est juste à la manière dont C # compiler donne la priorité pour déterminer quelle méthode est meilleure à appeler. Il y a une règle:

Si la méthode A a des types de paramètres plus spécifiques que la méthode B, la méthode A est meilleure que la méthode B dans la case de surcharge.

Dans votre cas, apparemment chaîne est plus spécifié que objet , c'est pourquoi loadtest (chaîne param) est appelé.

Vous pouvez renvoyer 7.5.3.2 Moteur Membre de fonction dans langage C # Spécification pour obtenir plus de compréhension.


2 commentaires

Y a-t-il une règle pour hiérarchiser ces choses?


@Jemi: Oui, beaucoup de règles, j'ai modifié ma réponse pour ajouter une spécification de langue C #, vous pouvez vous reporter 7.5.3.2 pour obtenir plus de règles