Use uma função para definir um parâmetro opcional


8

É possível usar o valor de retorno de uma função em vez de um valor específico como parâmetro opcional em uma função? Por exemplo, em vez de:

public void ExampleMethod(int a, int b, int c=10)
{
}

Eu quero algo como

private int ChangeC(int a, int b)
{
    return a+b;
}

public void ExampleMethod(int a, int b, int c=ChangeC(a,b))
{
}

4
Não, porque os parâmetros para esse método não existem nesse contexto. Você poderia usá-lo apenas na primeira linha do seu método: c = c ?? ChangeC (a, b)
Glenn Van Acker

Por favor, dê um exemplo em pseudo-código. Não está claro o que você deseja alcançar.
11119 Alex

Você poderia ter dois sobrecargas do método - um com três parâmetros e um com dois que chama o primeiro utilizando os resultados da chamada de função como o terceiro parâmetro
PaulF

Respostas:


8

Uma das maneiras:

private int ChangeC(int a, int b)
{
    return a+b; 
} 

public void ExampleMethod(int a, int b, int? c=null)
{
    c = c ?? ChangeC(a,b);
}

16

Não, isso não é possível. Para que um parâmetro seja opcional, o valor deve ser uma constante de tempo de compilação. No entanto, você pode sobrecarregar o método da seguinte maneira:

private int ChangeC(int a, int b){
    return a+b;
}

public void ExampleMethod(int a, int b, int c) {}

public void ExampleMethod(int a, int b)
{
    ExampleMethod(a, b, ChangeC(a, b));
}

3

É possível usar o valor de retorno de uma função em vez de um valor específico como parâmetro opcional em uma função?

Não, não é possível. O guia de programação C # sobre argumentos opcionais diz:

Um valor padrão deve ser um dos seguintes tipos de expressões:

  • uma expressão constante;

  • uma expressão do formulário new ValType(), onde ValTypeé um tipo de valor, como uma enumeração ou uma estrutura ;

  • uma expressão do formulário default(ValType), onde ValTypeé um tipo de valor.

Veja outras respostas para soluções alternativas.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.