Compiler Error CS0034
运算符“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 使其能够定义一个类,在其中实现针对 int 和 bool 的用户定义的隐式转换,并对该类型的对象使用按位 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;
}
}
}