El compilador no sabe a que metodo se supone que debe invocar.
Variant puede ser cualquier tipo (esa es su ventaja) entre sus contras es que hay que andar haciendo conversiones, chequeos de tipo, consumen mas memoria y son mas lentos.
Imaginate este caso:
Código Delphi
[-]
procedure MostrarMensaje(const Msg: string); overload;
procedure MostrarMensaje(const Numero: Integer); overload;
var
Valor: Variant;
begin
Valor := 5;
MostrarMensaje(Valor); E2251 Ambiguous overloaded call to MostrarMensaje
end;
La solucion: explicitamente indicar el tipo, por ejemplo usando
http://docwiki.embarcadero.com/Libraries/en/System.Variants.VarToStr
Código Delphi
[-]
var
Valor: Variant;
begin
Valor := 5;
MostrarMensaje(VarToStr(Valor)); invoca a procedure MostrarMensaje(const Msg: string);
end;