Sdílet prostřednictvím


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ů:

  1. Přístupnost Eliminuje jakékoli přetížení s úrovní přístupu, která brání volajícímu kódu v jeho volání.

  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 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í.

  4. 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 nebo Off.

  5. 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í.

  6. 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.

Flow diagram of overload resolution process

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é