Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se tratan los siguientes errores y advertencias del compilador:
- CS8108: no se puede pasar el argumento con el tipo dinámico al parámetro params 'parameter' de la función local 'method'.
- CS8112: la función local 'method' debe declarar un cuerpo porque no está marcado como "static extern".
- CS8321: la función local 'method' se declara pero nunca se usa
- CS8421: una función local estática no puede contener una referencia a "variable".
- CS8422: una función local estática no puede contener una referencia a "this" o "base".
Las funciones locales se agregaron en C# 7.0. Permiten declarar métodos auxiliares dentro de otro miembro. Los diagnósticos de este artículo abarcan las declaraciones, las llamadas y el uso de las funciones locales, así como las restricciones de captura adicionales de las funciones locales static.
Cuerpos de función locales
- CS8112: la función local 'method' debe declarar un cuerpo porque no está marcado como "static extern".
Una declaración de función local debe incluir un cuerpo, a menos que la función local se declare static extern. Agregue un cuerpo de bloque o un cuerpo de expresión a la función local. Si la implementación se proporciona externamente, marque la función static extern local y asegúrese de que la declaración sigue las reglas para los métodos externos.
Parámetros `params` y argumentos dinámicos
- CS8108: No se puede pasar un argumento con tipo dinámico al parámetro params 'parameter' de la función local 'method'.
Una llamada de función local no puede pasar un dynamic argumento a un params parámetro. Convierta el valor al tipo de elemento o al tipo de matriz esperado por el params parámetro antes de la llamada. También puede almacenar los valores en una matriz con tipo explícito y pasar esa matriz a la función local.
Funciones locales no usadas
- CS8321: la función local 'method' se declara pero nunca se usa
El compilador notifica esta advertencia cuando se declara una función local, pero no hay código accesible que lo llame. Elimine la función local no utilizada o llámela desde el miembro contenedor. Si piensa usar la función local en un cambio futuro, manténgala fuera del origen hasta que sea necesaria.
Las funciones locales estáticas no pueden capturar el estado
- CS8421: una función local estática no puede contener una referencia a "variable".
- CS8422: una función local estática no puede contener una referencia a "this" o "base".
Una static función local no puede capturar el estado del ámbito envolvente. No puede hacer referencia a variables locales del ámbito contenedor, parámetros ni miembros de instancia mediante this, ni al propio this. Pase cada valor que la función local necesita como parámetro (CS8421, CS8422). Si la función local debe capturar variables o el estado de instancia del ámbito contenedor, quite el modificador static.
En el ejemplo siguiente se muestran referencias que provocan la advertencia 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 corregir el error CS8422, pase los datos de instancia necesarios a la función local, mueva el asistente fuera del contexto de la instancia o quite static cuando la función local debe tener acceso al estado de la instancia.
Diagnósticos relacionados
- Para obtener más información sobre las funciones locales en árboles de expresión, vea Algunas expresiones están prohibidas en árboles de expresión en mensajes del compilador de C#.
- Para obtener más información sobre las funciones locales con parámetros de tipo genérico, consulte Resolución de errores y advertencias relacionados con parámetros de tipo genéricos y argumentos de tipo en mensajes del compilador de C#.
- Para obtener más información sobre los atributos en las funciones locales, consulte Resolución de errores y advertencias que implican la declaración de atributos y el uso de atributos en el código en los mensajes del compilador de C#.
- Para obtener más información sobre las variables capturadas en funciones anónimas, consulte Errores y advertencias de expresiones lambda en mensajes del compilador de C#.
- Para obtener más información sobre las capturas en constructores y constructores principales, consulte Resolución de errores relacionados con declaraciones de constructor y inicializadores de módulo en mensajes del compilador de C#.