Qual a forma básica de dar tipos aos parâmetros?

Function name (parm1 as type1, parm2 as type2, ..., parmN as typeN)


Visite os Tipos Nativos.


Function typedFunc(parm1 as Numeric, parm2 as Character) as Variant



Quais são as checagens feitas em relação aos parâmetros?
Existem dois momentos em que a consistência dos parâmetros é checada:

  1. Em tempo de compilação
    1.  verifica se a quantidade de argumentos passados é coerente;
    2. verifica se os tipos dos argumentos passados são compatíveis com os tipos declarados.

  2. Em tempo de execução
    1. realiza os mesmos tratamentos de tempo de compilação;
    2. tem o potencial de olhar também funções ou métodos que foram definidos em outros fontes.


Function typedFunc(nVar as Numeric, cVar as Character) as Logical
Local lVar as Logical
lVar := IIF(cVar == "TLPP", .T., .F.)
lVar := lVar .AND. (nVar == 1)
Return lVar

Function Test()Local lVar as Logical
lVar := typedFunc(2, "TLPP")  // Compilação OK
lVar := typedFunc("TLPP", 2)  // Erro de Compilação
lVar := typedFunc(1)          // Erro de Compilação
Return .T.


Agora, considere uma função f2 declarada em um fonte diferente de Function Test.
Admita ainda que a Function f2 tenha a seguinte linha declarativa:

Function f2(nVar as Date)

Function Test()
Local dVar := date() as Date
Local cVar := dtos(dVar) as Character
f2(dVar)  // Ok, sem problemas
f2(cVar)  // Valendo-se da tipagem, dará erro em tempo de execução.
Return .T.


No exemplo anterior, o runtime faz-se valer da tipagem dos parâmetros para acusar erro na segunda chamada a f2.
É importante frisar que esse erro acontece no ato da chamada da função, podendo antecipar problemas que só viriam à tona em um nível mais profundo da stack de execução.