Errore del compilatore CS0034

Aggiornamento: novembre 2007

Messaggio di errore

L'operatore 'operatore' è ambiguo su operandi di tipo 'tipo1' e 'tipo2'.
Operator 'operator' is ambiguous on operands of type 'type1' and 'type2'

È stato utilizzato un operatore su due oggetti e il compilatore ha rilevato più di una conversione. Poiché le conversioni devono essere univoche, sarà necessario eseguire un cast o rendere esplicita una delle conversioni. Per ulteriori informazioni, vedere Operatori di conversione (Guida per programmatori C#).

Il seguente codice di esempio genera l'errore 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;
   }
}

In C# 1.1 un bug del compilatore ha reso possibile la definizione di una classe con conversioni implicite definite dall'utente in int e bool e l'utilizzo di un operatore AND bit per bit (&) su oggetti di tale tipo. In C# 2.0, questo bug è stato corretto per rendere il compilatore compatibile con la specifica C# e, di conseguenza, il codice seguente genera ora 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;
        }
    }

    
}