C# Language
Overbelasting resolutie
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);