更新:2007 年 11 月

错误消息

运算符“operator”对于“type1”和“type2”类型的操作数具有二义性

运算符用在了两个对象上,并且编译器找到多个转换。因为转换必须是唯一的,因此必须进行一次强制转换,或者使其中一个转换成为显式转换。有关更多信息,请参见转换运算符(C# 编程指南)

下面的示例生成 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;
   }
}

在 C# 1.1 中,一个编译器 Bug 使其能够定义一个类,在其中实现针对 intbool 的用户定义的隐式转换,并对该类型的对象使用按位 AND 运算符 (&)。在 C# 2.0 中,已修复此 Bug 以使编译器符合 C# 规范,因此以下代码现在将导致错误 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;
        }
    }

    
}