Compilerfehler CS0034

Aktualisiert: November 2007

Fehlermeldung

Der Operator "Operator" bei Operanden vom Typ "Typ1" und "Typ2" mehrdeutig.
Operator 'operator' is ambiguous on operands of type 'type1' and 'type2'

Ein Operator wurde auf zwei Objekte angewendet, und der Compiler hat mehr als eine Konvertierung gefunden. Da Konvertierungen eindeutig sein müssen, müssen Sie eine Umwandlung vornehmen oder eine der Konvertierungen explizit machen. Weitere Informationen finden Sie unter Konvertierungsoperatoren (C#-Programmierhandbuch).

Im folgenden Beispiel wird CS0034 generiert:

// 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 ermöglichte ein Compilerfehler die Definition einer Klasse mit impliziten benutzerdefinierten Konvertierungen zu int und zu bool sowie die Verwendung eines bitweisen AND-Operators (&) für Objekte dieses Typs. Dieser Fehler wurde in C# 2.0 behoben, um die Anforderungen der C#-Spezifikation zu erfüllen. Aus diesem Grund wird bei folgendem Code jetzt CS0034 generiert:

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;
        }
    }

    
}

Community-Beiträge

Anzeigen: