Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este artigo aborda os seguintes erros e avisos do compilador:
- CS8108: Não é possível passar o argumento com tipo dinâmico para o parâmetro 'parameter' da função local 'method'.
- CS8112: A função local 'method' deve declarar um corpo porque ela não está marcada com 'static extern'.
- CS8321: a função local 'method' é declarada, mas nunca usada
- CS8421: uma função local estática não pode conter uma referência à "variável".
- CS8422: uma função local estática não pode conter uma referência a 'this' ou 'base'.
As funções locais foram adicionadas ao C# 7.0. Eles permitem que você declare métodos auxiliares dentro de outro membro. Os diagnósticos deste artigo abrangem declarações de funções locais, chamadas, uso e as restrições adicionais de captura para funções locais static.
Corpos de funções locais
- CS8112: A função local 'method' deve conter um corpo porque ela não está marcada como 'static extern'.
Uma declaração de função local deve incluir um corpo, a não ser 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, marque a função static extern local e verifique se a declaração segue as regras para métodos externos.
Parâmetros do Params e argumentos dinâmicos
- CS8108: Não é possível passar o argumento com tipo dinâmico para o parâmetro 'parameter' da função local 'method'.
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 matriz esperado pelo params parâmetro antes da chamada. Você também pode armazenar os valores em uma matriz tipada explicitamente e passar essa matriz para a função local.
Funções locais não utilizados
- CS8321: a função local 'method' é declarada, mas nunca usada
O compilador emite esse aviso quando você declara uma função local, mas nenhum código alcançável a chama. Remova a função local não utilizada ou chame-a no membro encapsulador. Se você pretende usar a função local em uma alteração futura, mantenha-a fora da origem até que ela seja necessária.
Funções locais estáticas não podem capturar o 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 'this' ou 'base'.
Uma static função local não pode capturar o estado do escopo delimitador. Ele não pode referenciar variáveis locais, parâmetros nem membros de instância do escopo envolvente por meio de this, nem o próprio this. Passe cada valor que a função local precisa como um parâmetro (CS8421, CS8422). Se a função local precisar capturar variáveis ou o estado da instância do escopo delimitador, remova o static modificador.
O exemplo a seguir mostra referências que causam 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 de instância necessários para a função local, mova o auxiliar para fora do contexto da instância ou remova static quando a função local precisar acessar o estado da instância.
Diagnóstico relacionado
- Para obter mais informações sobre funções locais em árvores de expressão, consulte Algumas expressões são proibidas em árvores de expressão em mensagens do compilador C#.
- Para obter mais informações sobre funções locais com parâmetros de tipo genérico, consulte Resolver erros e avisos relacionados a parâmetros de tipo genérico e argumentos de tipo em mensagens do compilador C#.
- Para obter mais informações sobre atributos em funções locais, consulte Resolver erros e avisos que envolvem declaração de atributo e uso de atributo em seu código em mensagens do compilador C#.
- Para obter mais informações sobre variáveis capturadas em funções anônimas, consulte erros de expressão Lambda e avisos em mensagens do compilador C#.
- Para obter mais informações sobre capturas em construtores e construtores primários, consulte Resolver erros relacionados a declarações de construtor e inicializadores de módulo em mensagens do compilador C#.