Посмотрите на подпись вашего оператора:
public static explicit operator Derived1(Derived2 d2);
Обратите внимание, что статический . То, что вы видите, похоже на ограничение разрешения перегрузки метода.
По сути, это та же самая причина, по которой ниже выводится «Объект» вместо «Строка»:
static void WriteObject(object obj) { Console.WriteLine("Object"); }
static void WriteObject(string str) { Console.WriteLine("String"); }
object obj = "I am a string.";
WriteObject(obj);
То есть компилятору нужно выбрать перегрузку во время компиляции. В случае приведения от Base
к Derived1
перегрузка с надлежащей подписью отсутствует, поэтому он пытается выполнить фактическое снижение. Объявление bd2
как Derived2
, как уже упоминали другие, "исправит" это, позволив компилятору выбрать ваше пользовательское преобразование.