Resolver erros e avisos relacionados com funções locais

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.