Compartir a través de


Resuelva errores y advertencias que afectan a la resolución de sobrecargas.

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

  • CS0034 - El operador es ambiguo en operandos de tipo 'type1' y 'type2'
  • CS0035 - El operador es ambiguo en un operando de tipo 'type'
  • CS0111 - El tipo ya define un miembro denominado 'name' con los mismos tipos de parámetro
  • CS0121 - La llamada es ambigua entre los siguientes métodos o propiedades
  • CS0457 - Conversiones ambiguas definidas por el usuario al convertir de 'type1' a 'type2'
  • CS0663 - No se pueden definir métodos sobrecargados que difieran solo en ref y out.
  • CS1007 - Ya se ha definido el descriptor de acceso de la propiedad
  • CS1019 - Se esperaba un operador unario sobrecargable
  • CS1020 - Se esperaba un operador binario sobrecargable
  • CS1501 - Ninguna sobrecarga para el método "method" acepta argumentos "number"
  • CS1534 - El operador binario sobrecargado 'operator' toma dos parámetros
  • CS1535 - El operador unario sobrecargado 'operador' toma un parámetro
  • CS1928 - 'Type' no contiene una definición para 'method' y el mejor 'method' de sobrecarga del método de extensión tiene algunos argumentos no válidos.
  • CS1929 - 'TypeA' no contiene una definición de 'method' y la mejor sobrecarga de método de extensión 'TypeB.method' requiere un receptor de tipo 'TypeC'
  • CS8315 - El operador es ambiguo en los operandos
  • CS9261 - No se puede usar 'OverloadResolutionPriorityAttribute' en un miembro invalidado.
  • CS9262 - No se puede usar 'OverloadResolutionPriorityAttribute' en este miembro.

Además, se muestra la siguiente advertencia del compilador:

  • CS3006 - El método sobrecargado 'method', que solo se diferencia en ref o out, o en el rango de matriz, no es conforme a CLS

Definición de sobrecarga incorrecta

  • CS0663 - No se pueden definir métodos sobrecargados que difieran solo en ref y out.
  • CS1019 - Se esperaba un operador unario sobrecargable
  • CS1020 - Se esperaba un operador binario sobrecargable
  • CS1534 - El operador binario sobrecargado 'operator' toma dos parámetros
  • CS1535 - El operador unario sobrecargado 'operador' toma un parámetro

Además, se muestra la siguiente advertencia del compilador:

  • CS3006 - El método sobrecargado 'method', que solo se diferencia en ref o out, o en el rango de matriz, no es conforme a CLS

Al crear operadores sobrecargados en la clase, la firma debe coincidir con el número de parámetros necesarios para ese operador. Tiene el número incorrecto de parámetros en la definición del operador.

Además, los operadores de sobrecarga deben usar el nombre de operador definido. La única excepción es cuando se crea un operador de conversión, donde el nombre del operador coincide con el tipo de valor devuelto de la conversión.

Sobrecargas duplicadas definidas

  • CS0111 - El tipo ya define un miembro denominado 'name' con los mismos tipos de parámetro
  • CS1007 - Ya se ha definido el descriptor de acceso de la propiedad

Estos errores indican que ha creado sobrecargas que no son diferentes. Los motivos comunes incluyen:

  • Los tipos de parámetros coincidentes tienen una conversión de identidad. Por ejemplo, M(dynamic) y M(object) o M2(string) y M2(string?).
  • Los tipos de parámetros coincidentes solo difieren en el modificador de referencia. Por ejemplo, M(ref int) y M(out int).
  • Ha incluido un init y un descriptor de acceso set para una propiedad.

No se encontró ninguna sobrecarga

  • CS1501 - Ninguna sobrecarga para el método 'method' acepta argumentos 'number'
  • CS1928 - 'Type' no contiene una definición para 'method' y el mejor 'method' de sobrecarga del método de extensión tiene algunos argumentos no válidos.
  • CS1929 - 'TypeA' no contiene una definición de 'method' y la mejor sobrecarga de método de extensión 'TypeB.method' requiere un receptor de tipo 'TypeC'

El código llama a un método donde existe el nombre, pero algunos argumentos son incorrectos o ha usado el número incorrecto de argumentos. Si intenta llamar a un método de extensión, es posible que la clase contenedora esté en un espacio de nombres que no se importa.

Nota:

Los compiladores más recientes no usan el error CS1928. Los compiladores más recientes usan CS1929 exclusivamente.

Sobrecargas ambiguas

  • CS0034 - El operador es ambiguo en operandos de tipo 'type1' y 'type2'
  • CS0035 - El operador es ambiguo en un operando de tipo 'type'
  • CS0121 - La llamada es ambigua entre los siguientes métodos o propiedades
  • CS0457 - Conversiones ambiguas definidas por el usuario al convertir de 'type1' a 'type2'
  • CS8315 - El operador es ambiguo en los operandos

Estos errores indican que no hay una sobrecarga mejor que otras. Hay varias causas posibles para estos errores:

  • Los distintos argumentos son mejores para cada parámetro. Uno podría ser una coincidencia exacta y el otro requerir una conversión:

      void M(int a, double b) {    }
      void M(double a, int b) {}
    
      M(1, 1); // ambiguous
    
  • Varios operadores de conversión definidos por el usuario son candidatos. Los operadores de conversión se pueden declarar en el tipo de origen, sus tipos base, el tipo de destino o sus tipos base. Si se definió un operador de conversión en más de uno, el compilador no puede elegir.

  • Varios operadores de conversión podrían realizar una conversión compatible.

  • Se pueden elegir uno o varios argumentos default (no default(T)) y varios tipos.

En la mayoría de estos casos, agregar una conversión explícita puede especificar qué sobrecarga se debe elegir.

Prioridad de resolución de sobrecarga

  • CS9261 - No se puede usar 'OverloadResolutionPriorityAttribute' en un miembro invalidado.
  • CS9262 - No se puede usar 'OverloadResolutionPriorityAttribute' en este miembro.

El código infringía las reglas para usar OverloadResolutionPriorityAttribute para favorecer una sobrecarga en lugar de otra. No puede aplicar OverloadResolutionPriorityAttribute a los siguientes tipos de método:

  • Propiedades no del indexador
  • Descriptores de acceso de propiedad, indexador o evento
  • Operadores de conversión
  • Expresiones lambda
  • Funciones locales
  • Finalizadores
  • Constructores estáticos

Además, no puede aplicar OverloadResolutionPriorityAttribute a un override de un miembro virtual o abstract. El compilador usa el valor de la declaración de tipo base.