Ошибка компилятора CS0034
Обновлен: Ноябрь 2007
Сообщение об ошибке
Оператор "оператор" для операндов типа "тип 1" и "тип 2" является неоднозначным
Operator 'operator' is ambiguous on operands of type 'type1' and '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 ошибка компилятора позволяла определять класс с неявными пользовательскими преобразованиями в int и bool, и использовать битовый оператор AND (&) в объектах такого типа. В языке C# версии 2.0 эта ошибка была исправлена и компилятор следовал спецификации языка 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;
}
}
}