Sdílet prostřednictvím


Rozlišení přetížení (Visual Basic)

Kompilátor jazyka Visual Basic musí rozhodnout, kterou přetíženou verzi zavolat, pokud je procedura definována v několika přetížených verzích. Rozhoduje se provedením následujících kroků:

  1. Přístupnost. Eliminuje jakýkoliv nadměrný požadavek nastavením úrovně přístupu, který zabraňuje volajícímu kódu, aby ho zavolal.
  2. Počet parametrů Eliminuje jakékoli přetížení, které definuje jiný počet parametrů, než je zadáno ve volání.
  3. Datové typy parametrů. Kompilátor dává metodám instance přednost před rozšiřujícími metodami. Pokud je nalezena nějaká metoda instance, která vyžaduje pouze rozšiřující převody tak, aby odpovídaly volání procedury, všechny rozšiřující metody jsou vyřazeny. Kompilátor pokračuje pouze s kandidáty metody instance. Pokud se taková metoda instance nenajde, pokračuje metodami instance i rozšíření. V tomto kroku eliminuje přetížení, pro které nelze převést datové typy volajících argumentů na typy parametrů definované v přetížení.
  4. Zúžení konverze. Eliminuje jakékoli přetížení, které vyžaduje zúžení převodu z typů volajících argumentů na definované typy parametrů. Tento krok probíhá bez ohledu na to, zda je přepínač pro kontrolu typů (Příkaz Strict) nastaven na On nebo Off.
  5. Nejmenší rozšiřování Kompilátor zvažuje zbývající přetížení po dvojicích. Pro každou dvojici porovnává datové typy definovaných parametrů. Pokud se typy v jednom z přetížení rozšíří na odpovídající typy v druhém, kompilátor odstraní druhý typ. To znamená, že zachová přetížení, které vyžaduje nejmenší rozšíření.
  6. Priorita rozlišení přetížení. Kompilátor odebere všechna přetížení, která mají nižší hodnotu OverloadResolutionPriorityAttribute než nejvyšší hodnota u jakéhokoli z kandidátů na přetížení. Jakékoli přetížení bez tohoto atributu je přiřazena výchozí hodnota nula.
  7. Jeden kandidát. Pokračuje v zvažování přetížení ve dvojicích, dokud nezůstane pouze jedno přetížení, a vyřeší volání tohoto přetížení. Pokud kompilátor nemůže omezit přetížení na jednoho kandidáta, vygeneruje chybu.

Následující obrázek znázorňuje proces, který určuje, kterou z přetížených verzí má být volána.

diagram toku procesu řešení přetížení

Následující příklad ukazuje tento proces řešení přetížení.

Overloads Sub z(ByVal x As Byte, ByVal y As Double)
End Sub
Overloads Sub z(ByVal x As Short, ByVal y As Single)
End Sub
Overloads Sub z(ByVal x As Integer, ByVal y As Single)
End Sub
Dim r, s As Short
Call z(r, s)
Dim p As Byte, q As Short
' The following statement causes an overload resolution error.
Call z(p, q)

V prvním volání kompilátor eliminuje první přetížení, protože typ prvního argumentu (Short) se zúží na typ odpovídajícího parametru (Byte). Poté eliminuje třetí přetížení, protože každý typ argumentu ve druhém přetížení (Short a Single) se rozšiřuje na odpovídající typ třetího přetížení (Integer a Single). Druhé přetížení vyžaduje menší rozšíření, takže ho kompilátor používá pro volání.

Ve druhém volání kompilátor nemůže eliminovat žádné přetížení na základě zúžení. Eliminuje třetí přetížení z stejného důvodu jako v prvním volání, protože může volat druhé přetížení s menším rozšířením typů argumentů. Kompilátor však nemůže rozlišit mezi prvním a druhým přetížením. Každý má jeden definovaný typ parametru, který rozšiřuje na odpovídající typ v druhém (ByteShort, ale Single na Double). Kompilátor proto generuje chybu řešení přetížení.

Přetížené argumenty Optional a ParamArray

Pokud dvě přetížení procedury mají identické podpisy s tím rozdílem, že poslední parametr je deklarován jako Volitelné v jednom a ParamArray ve druhém, kompilátor vyřeší volání této procedury následujícím způsobem:

Pokud volání zadá poslední argument jako Kompilátor vyhodnotí volání přetížené metody, která deklaruje poslední argument jako
Žádná hodnota (argument vynechán) Optional
Jedna hodnota Optional
Dvě nebo více hodnot v seznamu odděleném čárkami ParamArray
Matice libovolné délky (včetně prázdného pole) ParamArray

Viz také