Это очень необычная проблема, и есть определенно много обходных решений, но я хотел бы понять, что на самом деле происходит и почему она не работает.
Таким образом, у меня есть 3 сборки в тестовом решении, первая сборка имеет тип ClassA:
public class ClassA
{
public string Name { get; set; }
}
Вторая сборка ссылается на первую сборку и имеет ClassB:
public class ClassB
{
public string Name { get; set; }
public static explicit operator ClassA(ClassB objB)
{
return new ClassA
{
Name = objB.Name
};
}
}
который имеет явный оператор, который должен быть использован для ввода класса ClassA. Скажем, что по какой-то причине мы не можем использовать наследование и просто используем кастинг как удобный способ преобразования одного типа в другой.
Теперь последняя сборка ссылается на вторую сборку (а не на первую!) и имеет тип ClassC:
public class ClassC
{
public string Name { get; set; }
public static explicit operator ClassB(ClassC objC)
{
return new ClassB
{
Name = objC.Name
};
}
}
который использует явный оператор рассылки по той же причине, что и ClassB.
Теперь интересная часть: если я попытаюсь использовать класс ClassC для ClassB в моем коде, например:
ClassC objC = new ClassC();
ClassB objB = (ClassB)objC;
Я получаю следующую ошибку:
Ошибка 1 Тип "FirstAssembly.ClassA" определен в сборке, на которую не ссылаются. Вы должны добавить ссылку на сборку "FirstAssembly, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null".
Я мог бы легко создать новый экземпляр ClassB и просто инициализировать его со значениями из экземпляра ClassC (например, я делаю это в явном операторе литья), и он будет работать нормально. Итак, что здесь не так?