Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Приведение аргумента типа в обобщенном типе - возможно ли такое? / 7 сообщений из 7, страница 1 из 1
14.12.2014, 23:59
    #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
15.12.2014, 00:34
    #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
15.12.2014, 01:24
    #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
15.12.2014, 12:02
    #38833967
Tamozhnya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение аргумента типа в обобщенном типе - возможно ли такое?
Shocker.Pro,

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

Чтобы выполнить его метод, нужно сделать приведение
...
Рейтинг: 0 / 0
15.12.2014, 12:14
    #38833997
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Приведение аргумента типа в обобщенном типе - возможно ли такое?
...
Рейтинг: 0 / 0
15.12.2014, 19:24
    #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
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Приведение аргумента типа в обобщенном типе - возможно ли такое? / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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