O C # 4.0 permite argumentos out
ou opcionais ref
?
c#-4.0
optional-parameters
optional-arguments
Joe Daley
fonte
fonte
null
padrão ( eu venho do PHP ) e testando paranull
continuar preenchendo o argumento ( para os familiares, pensepreg_match()
) De qualquer forma, embora eu entenda de um ponto técnico, isso pode ser atualmente impossível, e que PHP e C # sejam bastante incomparáveis, ainda assim seria uma ferramenta " agradável " de ter disponível.Respostas:
Como já mencionado, isso simplesmente não é permitido e acho que faz muito sentido. No entanto, para adicionar mais alguns detalhes, aqui está uma citação da Especificação do C # 4.0 , seção 21.1:
fonte
Não.
Uma solução alternativa é sobrecarregar com outro método que não possui parâmetros de saída / ref e que apenas chama seu método atual.
Atualização: se você possui o C # 7.0 , pode simplificar:
(Obrigado @Oskar / @Reiner por apontar isso.)
fonte
return SomeMethod(out string temp)
. Veja mais aqui: blogs.msdn.microsoft.com/dotnet/2016/08/24/…return SomeMethod(out _);
Não, mas outra ótima alternativa é fazer com que o método use uma classe de modelo genérica para parâmetros opcionais da seguinte maneira:
Então você pode usá-lo da seguinte maneira:
fonte
Na verdade, existe uma maneira de fazer isso que é permitida pelo C #. Isso volta ao C ++ e viola a boa estrutura Orientada a Objeto do C #.
USE ESTE MÉTODO COM CUIDADO!
Aqui está a maneira como você declara e escreve sua função com um parâmetro opcional:
Em seguida, chame a função assim:
Para que isso seja compilado, você precisará ativar o código não seguro nas opções do projeto. Esta é uma solução realmente hacky que geralmente não deve ser usada, mas se você tomar uma decisão estranha, misteriosa, misteriosa e inspirada em gerenciamento, REALMENTE precisa de um parâmetro de saída opcional em C #, isso permitirá que você faça exatamente isso.
fonte
ICYMI: Incluídos nos novos recursos do C # 7.0 enumerados aqui , "descartes" agora são permitidos como parâmetros de saída na forma de _, para permitir que você ignore parâmetros de que não se preocupa:
p.GetCoordinates(out var x, out _); // I only care about x
PS Se você também estiver confuso com a parte "out var x", leia o novo recurso sobre "Out Variables" no link também.
fonte
Não, mas você pode usar um delegado (por exemplo,
Action
) como alternativa.Inspirado em parte pela resposta de Robin R ao enfrentar uma situação em que pensei que queria um parâmetro opcional de saída, usei um
Action
delegado. Emprestei seu código de exemplo para modificá-lo para usoAction<int>
, a fim de mostrar as diferenças e semelhanças:Isso tem a vantagem de a variável opcional aparecer na fonte como um int normal (o compilador a agrupa em uma classe de fechamento, em vez de agrupá-la explicitamente em uma classe definida pelo usuário).
A variável precisa de inicialização explícita porque o compilador não pode assumir que o
Action
chamada será antes da saída da chamada da função.Não é adequado para todos os casos de uso, mas funcionou bem para o meu caso de uso real (uma função que fornece dados para um teste de unidade e onde um novo teste de unidade precisava de acesso a algum estado interno não presente no valor de retorno).
fonte
Use um método sobrecarregado sem o parâmetro out para chamar aquele com o parâmetro out para C # 6.0 e inferior. Não sei por que um C # 7.0 para .NET Core é a resposta correta para esse segmento quando foi perguntado especificamente se o C # 4.0 pode ter um parâmetro opcional de saída. A resposta é não!
fonte
Que tal assim?
Você ainda precisa passar um valor para o parâmetro em C #, mas é um parâmetro opcional ref.
fonte
[Optional]
anotação. Isso não ajuda.fonte