powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Приведение аргумента типа в обобщенном типе - возможно ли такое?
7 сообщений из 7, страница 1 из 1
Приведение аргумента типа в обобщенном типе - возможно ли такое?
    #38833666
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть простой набор определений:

Код: c#
1.
2.
3.
4.
5.
6.
    public interface IHuman { }
    public class Boy : IHuman { }
    public class Dog<T> where T : IHuman
    {
      public void Woof() { }
    }



есть желание сделать следующее приведение:
Код: c#
1.
2.
3.
4.
5.
      object dog = new Dog<Boy>();
      //////

      Dog<IHuman> dog1 = (Dog<IHuman>)dog;
      dog1.Woof();


казалось бы, все честно, однако, компилятор не дает сделать подобное приведение. Можно ли обойтись без dynamic, чтобы выполнить Woof?
...
Рейтинг: 0 / 0
Приведение аргумента типа в обобщенном типе - возможно ли такое?
    #38833670
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
не получится, совершенно разные типы.
нужно действовать через общий интерфейс или базовый
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
//как вариант
  public interface IHuman { }
    public class Boy : IHuman { }
    public abstract class BaseBoy
    {
        public abstract void Woof();
    }
    public class Dog<T>:BaseBoy where T : IHuman
    {
        public override void Woof()
        {
          //dsds;dk;
        }
    }
...
Рейтинг: 0 / 0
Приведение аргумента типа в обобщенном типе - возможно ли такое?
    #38833679
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри, слишком упросил пример, дело в том, что Woof на самом деле возвращает тип T, то есть такой вариант не подойдет :(

Код: c#
1.
2.
3.
4.
5.
6.
    public interface IHuman { }
    public class Boy : IHuman { }
    public class Dog<T> where T : IHuman
    {
      public T Woof() { }
    }

Код: c#
1.
2.
3.
4.
5.
      object dog = new Dog<Boy>();
      //////

      Dog<IHuman> dog1 = (Dog<IHuman>)dog;
      IHuman woof = dog1.Woof();
...
Рейтинг: 0 / 0
Приведение аргумента типа в обобщенном типе - возможно ли такое?
    #38833967
Tamozhnya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

зачем это промежуточное приведение? dog.Woof(); (не dog1.Woof();) и так выгафкает своего хозяина.
...
Рейтинг: 0 / 0
Приведение аргумента типа в обобщенном типе - возможно ли такое?
    #38833976
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dog имеет тип object (по определению задачи)

Чтобы выполнить его метод, нужно сделать приведение
...
Рейтинг: 0 / 0
Приведение аргумента типа в обобщенном типе - возможно ли такое?
    #38833997
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Приведение аргумента типа в обобщенном типе - возможно ли такое?
    #38834488
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

спасибо за ссылку.
Из нее следует, что ковариантным можно сделать только интерфейс, не не класс.

В итоге, определение приобрело интерфейс для собаки с ковариантным параметром типа:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    public interface IHuman { }
    public class Boy : IHuman { }

    public interface IDog<out T>
    {
      void Woof();
    }
    public class Dog<T> : IDog<T> where T : IHuman
    {
      public void Woof() { }
    }


ну и теперь можно привести объект к интерфейсу:
Код: c#
1.
2.
3.
4.
5.
      object dog = new Dog<Boy>();
      ///

      IDog<IHuman> dog1 = (IDog<IHuman>)dog;
      dog1.Woof();
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Приведение аргумента типа в обобщенном типе - возможно ли такое?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]