Zoeken…


Opmerkingen

Het proces van overbelastingsresolutie wordt beschreven in de C # specificatie , paragraaf 7.5.3. Ook relevant zijn de paragrafen 7.5.2 (type inferentie) en 7.6.5 (invocatie-uitdrukkingen).

Hoe de overbelastingsresolutie werkt zal waarschijnlijk worden gewijzigd in C # 7. De ontwerpnotities geven aan dat Microsoft een nieuw systeem zal uitrollen om te bepalen welke methode beter is (in gecompliceerde scenario's).

Eenvoudig voorbeeld van overbelasting

Deze code bevat een overbelaste methode met de naam Hallo :

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);
    }
}

Wanneer de hoofdmethode wordt aangeroepen, wordt deze afgedrukt

int
double

Tijdens het compileren, wanneer de compiler de methode-aanroep Hello(0) , vindt deze alle methoden met de naam Hello . In dit geval vindt het er twee. Vervolgens wordt geprobeerd te bepalen welke van de methoden beter is . Het algoritme om te bepalen welke methode beter is, is complex, maar komt meestal neer op "zo min mogelijk impliciete conversies uitvoeren".

In het geval van Hello(0) is er dus geen conversie nodig voor de methode Hello(int) maar is een impliciete numerieke conversie nodig voor de methode Hello(double) . De eerste methode wordt dus gekozen door de compiler.

In het geval van Hello(0.0) is er geen manier om impliciet 0.0 naar een int te converteren, dus de methode Hello(int) wordt niet eens overwogen voor overbelastingsresolutie. Alleen de methode blijft over en deze wordt dus gekozen door de compiler.

"params" wordt niet uitgebreid, tenzij noodzakelijk.

Het volgende programma:

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);
    }
}

zal afdrukken:

5
two
3

De oproep expressie Method(objectArray) kunnen worden geïnterpreteerd op twee manieren: één Object argument dat toevallig een array zijn (zodat het programma geeft als resultaat 1 omdat het aantal argumenten, of een reeks argumenten die in het zou normale vorm, alsof de methode Method niet het zoekwoord params . In deze situaties is het normale, niet-geëxpandeerde vorm heeft altijd voorrang. Dus, het programma uitgangen 5 .

In de tweede expressie, Method(objectArray, objectArray) , zijn zowel de uitgebreide vorm van de eerste methode als de traditionele tweede methode van toepassing. In dit geval hebben niet-uitgebreide vormen voorrang, dus drukt het programma er two .

In de derde expressie, Method(objectArray, objectArray, objectArray) , is de enige optie het gebruik van de uitgebreide vorm van de eerste methode, en dus drukt het programma 3 .

Null doorgeven als een van de argumenten

Als je hebt

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

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

en om de een of andere reden moet je de eerste overbelasting van F1 aanroepen, maar met x = null en dan eenvoudig doen

F1(null);

compileert niet omdat de oproep dubbelzinnig is. Om dit tegen te gaan kunt u doen

F1(null as MyType1);


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow