Resolver erros e avisos relacionados a funções locais

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.