更新:2007 年 11 月
错误消息
运算符“operator”对于“type1”和“type2”类型的操作数具有二义性运算符用在了两个对象上,并且编译器找到多个转换。因为转换必须是唯一的,因此必须进行一次强制转换,或者使其中一个转换成为显式转换。有关更多信息,请参见
下面的示例生成 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; } } } |