Поделиться через


Ошибка компилятора 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
   }
}