Compartir a través de


Resolver errores y advertencias en las declaraciones de miembros de extensión

En este artículo se tratan los siguientes errores del compilador:

  • CS1100: el método tiene un modificador de parámetro 'this' que no está en el primer parámetro
  • CS1101: el modificador de parámetro 'ref' no se puede usar con 'this'.
  • CS1102: el modificador de parámetro 'out' no se puede usar con 'this'.
  • CS1103: el primer parámetro de un método de extensión no puede ser de un tipo de puntero.
  • CS1105: los métodos de extensión deben ser estáticos.
  • CS1106: los métodos de extensión deben definirse en una clase estática no genérica.
  • CS1109: los métodos de extensión deben definirse en clases estáticas de nivel superior, "name" es una clase anidada.
  • CS1110: no se puede definir una nueva extensión porque no se encuentra el tipo ExtensionAttribute necesario del compilador. ¿Falta una referencia a System.Core.dll?
  • CS1112: No usar 'ExtensionAttribute'. Use la palabra clave 'this' en su lugar.
  • CS1113: No se puede utilizar un método de extensión definido en un tipo de valor para crear delegados.
  • CS1743: No se puede especificar un valor predeterminado para el parámetro "this".
  • CS9281: es posible que las declaraciones de extensión no tengan un nombre.
  • CS9282: las declaraciones de extensión solo pueden incluir métodos o propiedades.
  • CS9283: las extensiones deben declararse en una clase estática no genérica de nivel superior.
  • CS9284: el parámetro receptor de una extensión no puede tener un valor predeterminado.
  • CS9285: un contenedor de extensiones solo puede tener un parámetro receptor.
  • CS9287: un parámetro receptor no puede tener el mismo nombre que un parámetro de tipo de contenedor de extensión.
  • CS9288: un parámetro, una variable local o una función local no puede tener el mismo nombre que un parámetro de tipo de contenedor de extensión.
  • CS9289: el parámetro de tipo de miembro tiene el mismo nombre que un parámetro de tipo de contenedor de extensión.
  • CS9290: un parámetro, una variable local o una función local no puede tener el mismo nombre que un parámetro de extensión.
  • CS9291: 'value': un nombre de parámetro generado automáticamente entra en conflicto con un nombre de parámetro de extensión.
  • CS9292: un parámetro de tipo tiene el mismo nombre que un parámetro de extensión.
  • CS9293: no se puede usar un parámetro de extensión en este contexto.
  • CS9294: 'value': un nombre de parámetro generado automáticamente entra en conflicto con un nombre de parámetro de tipo de extensión.
  • CS9295: el tipo extendido debe hacer referencia a todos los parámetros de tipo declarados por la extensión, pero no se hace referencia a un parámetro de tipo.
  • CS9300: el parámetro receptor 'ref' de un bloque de extensión debe ser un tipo de valor o un tipo genérico restringido a struct.
  • CS9301: el parámetro receptor 'in' o 'ref readonly' de la extensión debe ser un tipo de valor concreto (no genérico).
  • CS9302: nuevo miembro protegido declarado en un bloque de extensión.
  • CS9303: no se pueden declarar miembros de instancia en un bloque de extensión con un parámetro de receptor sin nombre.
  • CS9304: no se pueden declarar descriptores de acceso de solo inicialización en un bloque de extensión.
  • CS9305: No se pueden usar modificadores en el parámetro receptor sin nombre del bloque de extensión.
  • CS9306: Los tipos y alias no se pueden denominar "extension".
  • CS9309: No está permitida una sintaxis de miembro de extensión en posición anidada dentro de una sintaxis de miembro de extensión.
  • CS9316: miembros de extensión no están permitidos como argumento a "nameof".
  • CS9317: el parámetro de un operador unario debe ser el tipo extendido.
  • CS9318: el tipo de parámetro para el operador ++ o -- debe ser el tipo extendido.
  • CS9319: uno de los parámetros de un operador binario debe ser el tipo extendido.
  • CS9320: El primer operando de un operador de corrimiento sobrecargado debe tener el mismo tipo que el tipo extendido.
  • CS9321: un bloque de extensión que extiende una clase estática no puede contener operadores definidos por el usuario.
  • CS9322: no se puede declarar el operador de instancia de un struct a menos que contenga el parámetro receptor de bloques de extensión sea un parámetro "ref".
  • CS9323: no se puede declarar el operador de extensión de instancia para un tipo que no se sabe que es una estructura y que no se sabe que es una clase.
  • CS9326: 'name': los nombres de los miembros de extensión no pueden ser los mismos que su tipo extendido.
  • CS9329: este bloque de extensión entra en conflicto con otro bloque de extensión. Generan nombres de tipo basados en contenido en conflicto en los metadatos.
  • CS9339: la resolución de extensión es ambigua entre los siguientes miembros.

Errores comunes en las declaraciones de extensión

  • CS1102: el modificador de parámetro 'out' no se puede usar con 'this'.
  • CS1103: el primer parámetro de un método de extensión no puede ser de un tipo de puntero.
  • CS1106: los métodos de extensión deben definirse en una clase estática no genérica.
  • CS1109: los métodos de extensión deben definirse en clases estáticas de nivel superior, "name" es una clase anidada.
  • CS1113: No se puede utilizar un método de extensión definido en un tipo de valor para crear delegados.
  • CS1743: No se puede especificar un valor predeterminado para el parámetro "this".
  • CS9283: las extensiones deben declararse en una clase estática no genérica de nivel superior.
  • CS9284: el parámetro receptor de una extensión no puede tener un valor predeterminado.
  • CS9285: un contenedor de extensiones solo puede tener un parámetro receptor.

El compilador emite estos errores cuando infringe las reglas que se aplican a todas las declaraciones de miembro de extensión, independientemente de la sintaxis elegida. Para obtener más información, vea Métodos de extensión.

Para declarar correctamente miembros de extensión, siga estos requisitos:

  • Declare el tipo contenedor como una clase o estructura no genérica static (CS1106, CS9283).
  • Declare el tipo contenedor en el nivel superior, no anidado dentro de otro tipo (CS1109, CS9283).
  • No convierta los métodos de extensión de tipos de valor en delegados (CS1113). Cree un método normal en su lugar.
  • No use el out modificador de parámetro en el parámetro receptor (CS1102).
  • No proporcione valores predeterminados para el parámetro receptor (CS1743, CS9284).
  • No extienda los tipos de puntero (CS1103). El parámetro al que se aplica el this modificador no puede ser un tipo de puntero.
  • Declare solo un parámetro de receptor por contenedor de extensión (CS9285).
  • CS9281: es posible que las declaraciones de extensión no tengan un nombre.
  • CS9282: las declaraciones de extensión solo pueden incluir métodos o propiedades.
  • CS9287: un parámetro receptor no puede tener el mismo nombre que un parámetro de tipo de contenedor de extensión.
  • CS9288: un parámetro, una variable local o una función local no puede tener el mismo nombre que un parámetro de tipo de contenedor de extensión.
  • CS9289: el parámetro de tipo de miembro tiene el mismo nombre que un parámetro de tipo de contenedor de extensión.
  • CS9290: un parámetro, una variable local o una función local no puede tener el mismo nombre que un parámetro de extensión.
  • CS9291: 'value': un nombre de parámetro generado automáticamente entra en conflicto con un nombre de parámetro de extensión.
  • CS9292: un parámetro de tipo tiene el mismo nombre que un parámetro de extensión.
  • CS9293: no se puede usar un parámetro de extensión en este contexto.
  • CS9294: 'value': un nombre de parámetro generado automáticamente entra en conflicto con un nombre de parámetro de tipo de extensión.
  • CS9295: el tipo extendido debe hacer referencia a todos los parámetros de tipo declarados por la extensión, pero no se hace referencia a un parámetro de tipo.
  • CS9300: el parámetro receptor 'ref' de un bloque de extensión debe ser un tipo de valor o un tipo genérico restringido a struct.
  • CS9301: el parámetro receptor 'in' o 'ref readonly' de la extensión debe ser un tipo de valor concreto (no genérico).
  • CS9302: nuevo miembro protegido declarado en un bloque de extensión.
  • CS9303: no se pueden declarar miembros de instancia en un bloque de extensión con un parámetro de receptor sin nombre.
  • CS9304: No se pueden declarar accesores de solo inicialización en un bloque de extensión.
  • CS9305: No se pueden aplicar modificadores al parámetro receptor no especificado en el bloque de extensión.
  • CS9306: Los tipos y alias no se pueden denominar "extension".
  • CS9309: No se permite usar una sintaxis de miembro de extensión en una posición anidada dentro de otra sintaxis de miembro de extensión.
  • CS9316: Los miembros de extensión no están permitidos como argumento para "nameof".
  • CS9317: el parámetro de un operador unario debe ser el tipo extendido.
  • CS9318: el tipo de parámetro para el operador ++ o -- debe ser el tipo extendido.
  • CS9319: uno de los parámetros de un operador binario debe ser el tipo extendido.
  • CS9320: el primer operando de un operador de desplazamiento sobrecargado debe tener el mismo tipo que el tipo extendido.
  • CS9321: un bloque de extensión que extiende una clase estática no puede contener operadores definidos por el usuario.
  • CS9322: no se puede declarar el operador de instancia en un struct a menos que el bloque de extensión contenga un parámetro receptor "ref".
  • CS9323: no se puede declarar el operador de extensión de instancia para un tipo que no se sabe que es una estructura y que no se sabe que es una clase.
  • CS9326: 'name': los nombres de miembro de extensión no pueden ser los mismos que su tipo extendido.
  • CS9329: este bloque de extensión entra en conflicto con otro bloque de extensión. Generan nombres de tipo basados en contenido en conflicto en los metadatos.
  • CS9339: la resolución de extensión es ambigua entre los siguientes miembros.

Estos errores son específicos de los bloques de extensión, una característica de C# 14. Los bloques de extensión se declaran mediante la extension palabra clave contextual en una clase estática. Para obtener más información, vea Métodos de extensión.

Para declarar los bloques de extensión correctamente, siga estos requisitos:

  • No incluya un token de nombre en la declaración de extensión (CS9281). La extensión declara solo el receptor.
  • No proporcione valores predeterminados para el parámetro receptor (CS9284, tratado en errores comunes).
  • No use la extension palabra clave para tipos o alias (CS9306). Es una palabra clave contextual solo para los bloques de extensión.

Para declarar correctamente miembros de extensión en bloques de extensión, siga estos requisitos además de las reglas comunes:

  • Incluya solo métodos o propiedades como miembros de extensión (CS9282). No se admiten otros tipos de miembro.
  • Proporcione un nombre de parámetro para que el receptor contenga miembros de extensión de instancia (CS9303).
  • Asegúrese de que el nombre del parámetro receptor es único dentro del bloque de extensión y no entra en conflicto con los parámetros de tipo (CS9287, CS9288, CS9289, CS9290, CS9291, CS9292, CS9294).
  • Haga referencia a todos los parámetros de tipo declarados en la extensión en el tipo extendido (CS9295). Se pueden agregar parámetros de tipo adicionales en miembros individuales.
  • No anidar bloques de extensión dentro de otros bloques de extensión (CS9309).
  • Use el modificador ref en el parámetro del receptor solo con tipos de valor o tipos genéricos limitados a struct (CS9300).
  • Use el modificador in o ref readonly en el parámetro receptor solo con tipos de valor no genéricos, concretos (CS9301).
  • No utilice modificadores en parámetros de receptor sin nombre (CS9305).
  • No declare protected miembros en bloques de extensión (CS9302). Los miembros de la extensión deben ser accesibles cuando la extensión esté dentro de su ámbito.
  • No declares descriptores de acceso solo en bloques de extensión (CS9304). Use establecedores de propiedades normales en su lugar.
  • No use miembros de extensión como argumentos para el nameof operador (CS9316).
  • Elija los nombres de miembro que difieren del nombre de tipo extendido (CS9326).
  • Asegúrese de que los bloques de extensión tienen nombres de tipo únicos basados en contenido en los metadatos (CS9329). Consolidar o diferenciar bloques de extensión para evitar conflictos.
  • Resuelva llamadas de miembro de extensión ambiguas proporcionando información de tipo más específica o usando nombres calificados (CS9339).

Requisitos para el operador del bloque de extensión

Los bloques de extensión admiten operadores definidos por el usuario con requisitos específicos:

  • Los operadores unarios deben tener el tipo extendido como parámetro (CS9317).
  • Los operadores de incremento () y decremento (++--) deben tener el tipo extendido como parámetro (CS9318).
  • Los operadores binarios deben tener al menos un parámetro que sea el tipo extendido (CS9319).
  • Los operadores shift deben tener el tipo extendido como primer operando (CS9320).
  • No declare operadores definidos por el usuario en bloques de extensión que extienden clases estáticas (CS9321).
  • Al extender una estructura con operadores de instancia, use el ref modificador en el parámetro receiver (CS9322).
  • No declare operadores de instancia para los tipos que no están restringidos para que sean una estructura o una clase (CS9323).
  • CS1100: el método tiene un modificador de parámetro 'this' que no está en el primer parámetro
  • CS1101: el modificador de parámetro 'ref' no se puede usar con 'this'.
  • CS1105: los métodos de extensión deben ser estáticos.
  • CS1110: no se puede definir una nueva extensión porque no se encuentra el tipo ExtensionAttribute necesario del compilador. ¿Falta una referencia a System.Core.dll?
  • CS1112: No usar 'ExtensionAttribute'. Use la palabra clave 'this' en su lugar.

Estos errores son específicos de los métodos de extensión en los que declara el receptor agregando el this modificador al primer parámetro. Para obtener más información, vea Métodos de extensión.

Para declarar this correctamente los métodos de extensión de parámetros, siga estos requisitos además de las reglas comunes:

  • Agregue el static modificador al método (CS1105).
  • Aplique el modificador de this parámetro solo al primer parámetro (CS1100).
  • No combines el ref modificador con el this modificador (CS1101). Para usar ref, convierta en un bloque de extensión.
  • Agregue una referencia a System.Core.dll en aplicaciones de .NET Framework (CS1110).
  • Use el this modificador en el primer parámetro en lugar de aplicar directamente el ExtensionAttribute atributo (CS1112).