Преобразование реализации интерфейса B в и реализация интерфейса A

#c# #types #interface #casting #type-conversion

#c# #типы #интерфейс #Кастинг #преобразование типов

Вопрос:

Я пытаюсь запустить приведенный ниже код. Я хочу преобразовать объект класса A в объект класса B, но я получаю сообщение об ошибке. Теоретически, A является частью B, поэтому я не вижу, почему это не сработает.

Я знаю, что это приведение действительно означает потерю некоторых данных, но это именно то, чего я хочу. Есть ли какой-нибудь способ запустить это?

 public class Program
{
    public static void Main()
    {
        var b = new B();
        var a = (A)b; //Error: Cannot convert type
    }
}

public interface IA{}

public interface IB : IA{}

public class A : IA{}

public class B : IB{}
  

Комментарии:

1. это IA то, что является частью B , а не A . Изменить на var a = (IA)b;

2. К вашему сведению: » Я знаю, что это приведение действительно означает потерю некоторых данных «. Что касается ссылочных типов (т.Е. объектов; не типов значений, таких как int , float и т.д.), приведение обычно не приводит к потере данных. Исключением из этого являются классы, которые реализуют (явные / неявные) операторы преобразования, пользовательская реализация которых привела бы к «потере данных» (так сказать)…

Ответ №1:

Очевидно, что B не относится к типу A и наоборот:

введите описание изображения здесь

Невозможно преобразовать B в A. Приведение возможно только к типам IB или IA.

Ответ №2:

Вы можете решить это несколькими способами, одним из которых является способ, указанный Гиладом Грином в его ответе, или также путем реализации метода преобразования:

         public static implicit operator A(B b)
        {
            //your code to convert from B to A
        }

        public static implicit operator B(A a)
        {
            //your code to convert from A to B
        }
  

Поскольку B реализует как IA, так и IB, вы не можете выполнять прямое преобразование друг в друга, если вы не реализуете что-то вроде фрагмента кода в этом ответе.

Комментарии:

1. Ну да, это возможно. Но я считаю, что это скорее продвинутая техника программирования, чем урок наследования объектов.

2. Я не могу с этим поспорить, Alpha75 в основном хорошо показал в своем ответе проблему того, почему он не мог перейти от одного к другому, я просто предоставил (несколько более продвинутый) способ получения программируемости, которую он запросил 🙂