Pergunta

Bem direto. O MSDN afirma que você pode usar o REF, mas não para métodos parciais. Estou apenas curioso quanto ao Por quê? Entendi que quando o código é compilado, os parciais são mesclados, então o que há com a restrição? Há mais para partial do que apenas tornar os arquivos de código mais limpos e organizados (por exemplo, olhos)?

Referência: Artigo do MSDN - "Métodos parciais podem ter Ref mas não Fora parâmetros. "

Foi útil?

Solução

Você deve considerar o que acontece se o método parcial não for implementado.

O que acontece então é que todas as chamadas para o método são despojadas como se nunca tivessem acontecido.

Então, para um método usando, seria assim:

stream s;
GetStream(out s);
s.Write(...);

e ser compilado como se dissesse o seguinte:

stream s;
s.Write(...);

Este código não é permitido porque s não foi inicializado. A garantia de que a variável seria inicializada no momento em que você tentar chamar o Write o método estava ligado à chamada para GetStream.

É o mesmo com métodos de retorno de dados. Como toda a chamada do método simplesmente não é compilada se você não implementou o método parcial, você precisa considerar o que pode ou não fazer e ainda deixar o código que o chama válido. Em termos de out e os valores de retorno, ele tem o potencial de deixar o código de chamada inválido ou incompleto, portanto não é permitido.

Quanto a ref, isso é válido, pois a inicialização foi atendida pelo código de chamada:

stream s = null;
GetStream(ref s); // may be stripped out
if (s != null)
    s.Write(...);

Outras dicas

Porque, diferentemente dos parâmetros da REF, os parâmetros out devem ser inicializados antes do retorno do método. Se o método parcial não for implementado (que é um cenário válido), como pode ser inicializado?

Meu palpite seria porque out Parâmetros não precisam ser inicializados enquanto ref Parâmetros fazem.

Se você usou um out Parâmetro Em um método parcial, como C# pode verificar se o parâmetro foi inicializado ou não?

Um out O parâmetro sugere que você deseja um valor fora do método. Se o método não existir, ele não poderá fornecer esse valor.

A alternativa seria definir o valor da variável explicitamente para seu valor padrão (0, nulo etc.) em vez de executar a chamada do método. Dessa forma, a variável ainda seria definitivamente inicializada - embora o valor padrão possa não ser terrivelmente útil. Acredito que a equipe C# considerou isso - pode até entrar em uma versão futura, quem sabe? Pessoalmente, duvido que seria particularmente útil, mas a possibilidade existe.

No momento, você sempre pode usar um ref Parâmetro em vez disso, e apenas inicialize a variável manualmente antes da chamada para qualquer que seja o valor padrão.

Eu diria que o motivo é porque um método parcial com apenas uma assinatura (ou seja, nenhuma implementação) ainda é válida. Se você tivesse um parâmetro out, um método sem implementação sempre causaria um erro (pois não há nada que atribua o valor externo)

Um método parcial é dividido em classes parciais. É necessário um método para atribuir um valor a um parâmetro out. Métodos parciais podem ou não ser implementados. Isso significaria que vários pedaços de código estão tentando atribuir valor ao parâmetro out.

Como todos os outros declararam out params devem ser atribuídos. Para adicionar isso, gerará erro do compilador CS0177 ref Por outro lado, deve ser atribuído antes de fazer a chamada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top