Ошибка компилятора CS0457
Обновлен: Ноябрь 2007
Сообщение об ошибке
Пользователь определил преобразование 'Метод преобразования 1' и 'Метод преобразования 2' при преобразовании из 'имя типа 1' в 'имя типа 2'
Ambiguous user defined conversions 'Conversion method name 1' and 'Conversion method name 2' when converting from 'type name 1' to 'type name 2'
Применимы два метода преобразования, и компилятор не может выбрать, какой из них использовать.
Эта ошибка возможна в следующих случаях:
Пользователь пытается преобразовать класс A в класс B, но A и B не связаны.
A происходит от A0, но не существует методов преобразования из A0 в B.
Класс B имеет подкласс B1 и существует метод преобразования из A в B1.
Компилятор будет считать оба метода преобразования одинаково подходящими, поскольку в первом методе предоставляется наилучший тип назначения, а во втором — источника. Поскольку компилятор не может принять решение, возникнет эта ошибка. Чтобы ее устранить, напишите новый явный метод преобразования из A в B.
Также можно, при наличии двух методов преобразования из A в B, указать, какой из них использовать, посредством явного приведения.
Пример
Следующий пример кода приводит к возникновению ошибки CS0457.
// CS0457.cs
using System;
public class A { }
public class G0 { }
public class G1<R> : G0 { }
public class H0 {
public static implicit operator G0(H0 h) {
return new G0();
}
}
public class H1<R> : H0 {
public static implicit operator G1<R>(H1<R> h) {
return new G1<R>();
}
}
public class Test
{
public static void F0(G0 g) { }
public static void Main()
{
H1<A> h1a = new H1<A>();
F0(h1a); // CS0457
}
}