Compartir a través de


Error del compilador CS0034

Actualización: noviembre 2007

Mensaje de error

El operador 'operador' es ambiguo en operandos del tipo 'tipo1' y 'tipo2'
Operator 'operator' is ambiguous on operands of type 'type1' and 'type2'

Se utilizó un operador en dos objetos y el compilador detectó más de una conversión. Las conversiones han de ser únicas, por lo que se requiere una conversión explícita de tipo 'cast' o hacer que una de las conversiones sea explícita. Para obtener más información, consulte Operadores de conversión (Guía de programación de C#).

El código siguiente genera el error CS0034:

// CS0034.cs
public class A
{
   // allows for the conversion of A object to int
   public static implicit operator int (A s)
   {
      return 0;
   }

   public static implicit operator string (A i)
   {
      return null;
   }
}

public class B
{
   public static implicit operator int (B s)
   // one way to resolve this CS0034 is to make one conversion explicit
   // public static explicit operator int (B s)
   {
      return 0;
   }

   public static implicit operator string (B i)
   {
      return null;
   }

   public static implicit operator B (string i)
   {
      return null;
   }

   public static implicit operator B (int i)
   {
      return null;
   }
}

public class C
{
   public static void Main ()
   {
      A a = new A();
      B b = new B();
      b = b + a;   // CS0034
      // another way to resolve this CS0034 is to make a cast
      // b = b + (int)a;
   }
}

En C# 1.1, un error del compilador permitía definir una clase con conversiones implícitas definidas por el usuario tanto para int como para bool, así como utilizar un operador AND bit a bit (&) en los objetos de ese tipo. Pero en C# 2.0, este error se corrigió para que el compilador fuese compatible con la especificación de C# y, por lo tanto, el siguiente código ahora producirá el error CS0034:

namespace CS0034
{
    class TestClass2
    {
        public void Test()
        {
            TestClass o1 = new TestClass();
            TestClass o2 = new TestClass();
            TestClass o3 = o1 & o2; //CS0034
        }
    }

    class TestClass
    {
        public static implicit operator int(TestClass o)
        {
            return 1;
        }

        public static implicit operator TestClass(int v)
        {
            return new TestClass();
        }

        public static implicit operator bool(TestClass o)
        {
            return true;
        }
    }

    
}