Error del compilador CS0457

Actualización: noviembre 2007

Mensaje de error

Conversiones ambiguas 'Nombre de método de conversión 1' y 'Nombre de método de conversión 2' definidas por el usuario al realizar la conversión de 'Nombre de tipo 1' a 'Nombre de tipo 2'
Ambiguous user defined conversions 'Conversion method name 1' and 'Conversion method name 2' when converting from 'type name 1' to 'type name 2'

Son aplicables dos métodos de conversión y el compilador no puede decidir cuál utilizar.

Un escenario que puede provocar este error es el siguiente:

  • Desea convertir la clase A en la clase B, donde A y B no están relacionadas.

  • A se deriva de A0 y existe un método que convierte A0 en B.

  • B tiene una subclase B1 y existe un método que convierte A en B1.

El compilador asigna la misma prioridad a ambos métodos de conversión, porque la primera conversión proporciona el mejor tipo de destino y la segunda ofrece el mejor tipo de origen. Puesto que el compilador no puede elegir, se genera este error. Para resolverlo, escriba un nuevo método explícito para efectuar la conversión de A en B.

Otro escenario que provoca este error es la existencia de dos métodos que conviertan A en B. Para corregirlo, especifique qué conversión se debe utilizar mediante una conversión explícita.

Ejemplo

El código siguiente genera el error CS0457.

// CS0457.cs
using System;
public class A { }

public class G0 {  }
public class G1<R> : G0 {  }

public class H0 {
   public static implicit operator G0(H0 h) {
      return new G0();
   }
}
public class H1<R> : H0 {
   public static implicit operator G1<R>(H1<R> h) {
      return new G1<R>();
   }
}

public class Test 
{
   public static void F0(G0 g) {  }
   public static void Main() 
   {
      H1<A> h1a = new H1<A>();
      F0(h1a);   // CS0457
   }
}