Recherche…


Remarques

Le processus de résolution de surcharge est décrit dans la spécification C # , section 7.5.3. Les sections 7.5.2 (inférence de type) et 7.6.5 (expressions d’invocation) sont également pertinentes.

La manière dont la résolution de la surcharge fonctionne sera probablement modifiée dans C # 7. Les notes de conception indiquent que Microsoft déploiera un nouveau système pour déterminer quelle méthode est la meilleure (dans les scénarios complexes).

Exemple de surcharge de base

Ce code contient une méthode surchargée nommée Hello :

class Example
{
    public static void Hello(int arg)
    {
        Console.WriteLine("int");
    }
 
    public static void Hello(double arg)
    {
        Console.WriteLine("double");
    }
 
    public static void Main(string[] args) 
    {
        Hello(0);
        Hello(0.0);
    }
}

Lorsque la méthode principale est appelée, elle sera imprimée

int
double

Au moment de la compilation, lorsque le compilateur trouve l'appel à la méthode Hello(0) , il trouve toutes les méthodes portant le nom Hello . Dans ce cas, il en trouve deux. Il essaie ensuite de déterminer laquelle des méthodes est la meilleure . L'algorithme permettant de déterminer quelle méthode est la meilleure est complexe, mais cela revient généralement à "effectuer le moins de conversions implicites possible".

Ainsi, dans le cas de Hello(0) , aucune conversion n'est nécessaire pour la méthode Hello(int) mais une conversion numérique implicite est nécessaire pour la méthode Hello(double) . Ainsi, la première méthode est choisie par le compilateur.

Dans le cas de Hello(0.0) , il n'y a aucun moyen de convertir implicitement 0.0 en int , donc la méthode Hello(int) n'est même pas prise en compte pour la résolution de la surcharge. Seule la méthode reste et elle est donc choisie par le compilateur.

"params" n'est pas développé, sauf si nécessaire.

Le programme suivant:

class Program
{
    static void Method(params Object[] objects)
    {
        System.Console.WriteLine(objects.Length);
    }   
    static void Method(Object a, Object b)
    {
        System.Console.WriteLine("two");
    }
    static void Main(string[] args)
    {
        object[] objectArray = new object[5];

        Method(objectArray);
        Method(objectArray, objectArray);
        Method(objectArray, objectArray, objectArray);
    }
}

imprimera:

5
two
3

La Method(objectArray) expression d’appel Method(objectArray) peut être interprétée de deux manières: un seul argument d’ Object qui se trouve être un tableau (le programme afficherait donc 1 car ce serait le nombre d’arguments, ou un tableau d’arguments, donné dans le forme normale, comme si la méthode Method n'a pas le mot - clé params . Dans ces situations, la normale, sous forme non expansé a toujours la priorité. Ainsi, les résultats du programme 5 .

Dans la deuxième expression, Method(objectArray, objectArray) , la forme développée de la première méthode et la seconde méthode traditionnelle sont applicables. Dans ce cas également, les formulaires non développés sont prioritaires, de sorte que le programme imprime two .

Dans la troisième expression, Method(objectArray, objectArray, objectArray) , la seule option consiste à utiliser la forme développée de la première méthode et le programme imprime donc 3 .

Passer null comme l'un des arguments

Si tu as

void F1(MyType1 x) {
    // do something
}

void F1(MyType2 x) {
    // do something else
}

et pour une raison quelconque, vous devez appeler la première surcharge de F1 mais avec x = null , puis faire simplement

F1(null);

ne compilera pas car l'appel est ambigu. Pour contrer cela, vous pouvez faire

F1(null as MyType1);


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow