Rozlišení přetěžování (Visual Basic)
Když kompilátor jazyka Visual Basic narazí na volání procedury, která je definována v několika přetížených verzích, kompilátor musí rozhodnout, které přetížení se má volat. Provede to provedením následujících kroků:
Přístupnost Eliminuje jakékoli přetížení s úrovní přístupu, která brání volajícímu kódu v jeho volání.
Počet parametrů Eliminuje jakékoli přetížení, které definuje jiný počet parametrů, než je zadáno ve volání.
Datové typy parametrů. Kompilátor dává metodám instance přednost před rozšiřujícími metodami. Pokud se zjistí 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 se zahodí a 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í.
Zužující převody. Eliminuje jakékoli přetížení, které vyžaduje zúžení převodu z typů volajících argumentů na definované typy parametrů. To platí bez ohledu na to, zda je přepínač kontroly typů (příkaz Option Strict)
On
neboOff
.Nejmíň rozšiřující. Kompilátor považuje zbývající přetížení ve 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í.
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í této přetížení. Pokud kompilátor nemůže snížit přetížení na jednoho kandidáta, vygeneruje chybu.
Následující obrázek znázorňuje proces, který určuje, kterou sadu přetížených verzí se má volat.
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
). Pak eliminuje třetí přetížení, protože každý typ argumentu ve druhém přetížení (Short
a Single
) rozšiřuje odpovídající typ třetí 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 přelož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 (Byte
na Short
, ale Single
na Double
). Kompilátor proto generuje chybu řešení přetížení.
Přetížené volitelné argumenty a argumenty ParamArray
Pokud dvě přetížení procedury mají identické podpisy s tím rozdílem, že poslední parametr je deklarován optional v jedné a ParamArray v druhé, kompilátor přeloží volání této procedury následujícím způsobem:
Pokud volání zadá poslední argument jako | Kompilátor přeloží volání přetížení deklarující 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é
- Nepovinné parametry
- Pole parametrů
- Přetížení procedury
- Řešení potíží s procedurami
- Postupy: Definice více verzí procedury
- Postupy: Volání přetížené procedury
- Postupy: Přetížení procedury, která přebírá nepovinné parametry
- Postupy: Přetížení procedury, která přebírá nekonečný počet parametrů
- Aspekty přetížení procedur
- Overloads
- Rozšiřující metody