Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Este artigo aborda os seguintes erros e avisos do compilador:
- CS8108: Não é possível passar um argumento com tipo dinâmico para o parâmetro params 'parameter' da função local 'method'.
- CS8112: A função local 'method' deve declarar um corpo porque não está assinalada como 'static extern'.
- CS8321: A função local 'método' é declarada mas nunca usada
- CS8421: Uma função local estática não pode conter uma referência a 'variável'.
- CS8422:Uma função local estática não pode conter uma referência a 'isto' ou 'base'.
Funções locais foram adicionadas em C# 7.0. Permitem-te declarar estratégias de apoio dentro de outro membro. Os diagnósticos abordados neste artigo abrangem declarações de funções locais, respetivas chamadas, utilização e as restrições adicionais de captura para as static funções locais.
Órgãos de função locais
- CS8112: A função local 'method' tem de declarar um corpo porque não está marcada como 'static extern'.
Uma declaração de função local tem de ter um corpo, a menos que a função local seja declarada static extern. Adicione um corpo de bloco ou um corpo de expressão à função local. Se a implementação for fornecida externamente, assinala a função static extern local e assegura-se de que a declaração segue as regras para métodos externos.
Parâmetros `params` e argumentos dinâmicos
- CS8108: Não é possível passar um argumento com tipo dinâmico para o parâmetro 'parâmetro' da função local 'método'.
Uma chamada de função local não pode passar um dynamic argumento para um params parâmetro. Converta o valor para o tipo de elemento ou tipo de array esperado pelo params parâmetro antes da chamada. Também podes guardar os valores num array explicitamente tipado e passar esse array para a função local.
Funções locais não utilizadas
- CS8321: A função local 'método' é declarada mas nunca usada
O compilador reporta este aviso quando declaras uma função local, mas nenhum código acessível a chama. Remova a função local não utilizada, ou chame-a a partir do membro anexo. Se pretende usar a função local numa alteração futura, mantenha-a fora da fonte até ser necessária.
Funções locais estáticas não conseguem capturar estado
- CS8421: Uma função local estática não pode conter uma referência a 'variável'.
- CS8422:Uma função local estática não pode conter uma referência a 'isto' ou 'base'.
Uma static função local não pode capturar o estado do âmbito envolvente. Não pode referenciar variáveis locais, parâmetros nem membros de instância envolventes através de this, nem o próprio this. Passe cada valor que a função local precisa como parâmetro (CS8421, CS8422). Se a função local tiver de capturar variáveis ou o estado da instância do âmbito delimitador, remova o modificador static.
O exemplo seguinte mostra referências que originam CS8422:
public class C
{
private int counter = 1;
public void IncreaseCounter()
{
static void LocalFunc(int addition)
{
this.counter += addition; // CS8422
base.ToString(); // CS8422
counter += addition; // CS8422: implicit this
ToString(); // CS8422: implicit base
}
LocalFunc(10);
}
}
Para corrigir o CS8422, passe os dados da instância necessários para a função local, mova o ajudante para fora do contexto da instância ou remova static quando a função local tem de aceder ao estado da instância.
Diagnósticos relacionados
- Para mais informações sobre funções locais em árvores de expressão, veja Algumas expressões são proibidas em árvores de expressões em mensagens do compilador C#.
- Para mais informações sobre funções locais com parâmetros de tipo genéricos, consulte Resolver erros e avisos relacionados com parâmetros genéricos de tipo e argumentos de tipo em mensagens do compilador C#.
- Para mais informações sobre atributos em funções locais, consulte erros e avisos do Resolve que envolvem a declaração e o uso de atributos no seu código em mensagens do compilador C#.
- Para mais informações sobre variáveis capturadas em funções anónimas, veja erros e avisos de expressão Lambda nas mensagens do compilador C#.
- Para mais informações sobre capturas em construtores e construtores primários, consulte Resolver erros relacionados com declarações de construtores e inicializadores de módulos em mensagens de compiladores C#.