Ошибка времени компиляции: «Невозможно преобразовать из B в T1» при работе с универсальными шаблонами, ограничениями и наследованием в C# - PullRequest
2 голосов
/ 26 мая 2020

У меня есть класс B , который имеет метод GetSomeB , который возвращает новый экземпляр своего класса:

public class B
{
    public B() { }
    public B GetSomeB ()
    {
        return new B();
    }
}

У меня есть класс A, который работает с дженериками. Дженерики должны быть объектом B или чего-то унаследованного от B. Однако мне нужно, чтобы типы атрибутов X и Y в A были специфическим типом подкласса c, а не только типом B, поэтому я использовал дженерики T1 и T2 :

class A<T1, T2>
        where T1 : B
        where T2 : B
    {
        public T1 X;
        public T2 Y;

        public A(T1 X, T2 Y)
        {
            this.X = X;
            this.Y = Y;
        }

        public A<T1, T2> GetSomeA()
        {
            return new A<T1, T2>(this.X.GetSomeB(), this.Y.GetSomeB());
        }
 }

Я получаю ошибки времени компиляции: Невозможно преобразовать из B в T1 и Невозможно преобразовать из B в T2 из строки в GetSomeA метод в классе A Как я могу обойти это?

1 Ответ

2 голосов
/ 26 мая 2020

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

public A<T1, T2> GetSomeA() 
{
      return new A<T1, T2>((T1)this.X.GetSomeB(), (T2)this.Y.GetSomeB());
}
...