9 / 9 / 0
Регистрация: 27.01.2013
Сообщений: 248
1

Обобщенный интерфейс ковариантность

26.11.2014, 22:22. Показов 1812. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Господа, подскажите пожалуйста по коду. Вот ради эксперимента набросал код, но не пойму, почему метод GetNameObj возвращает объект типа a1 если ему как через конструктор, так и через параметр типа передают a2.
Вот код
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System;
interface a<out T>
{
    T GetNameObj();
}
class b<T> : a<T>
{
    T t;
    public b(T o)
    {
        t = o;
    }
    public T GetNameObj()
    {
        Console.WriteLine(typeof(T).Name);
        return t;
    }
}
class a1 {  }
class a2 : a1 {  }
class c
{
    static void Main()
    {
        a<a1> A = new b<a2>(new a2());
        a2 A2 =(a2) A.GetNameObj(); //вот этот метод почему-то возвращает тип a1
        
    }
}
Мне кажется, что единственным объяснением такого поведения является то, что методу без разницы что я там передаю за тип данных в конструктор или параметр типа, ему главное что в интерфейсной ссылке указан параметр типа a1. Но в таком случае приоритет выше у интрефейса чем у у типа объекта ? Или я что-то не правильно понял ? Подскажите пожалуйста.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.11.2014, 22:22
Ответы с готовыми решениями:

Обобщенный интерфейс
Объясните плиз, функцию и суть обобщённого интерфейса? суть обобщенного типа мне понятно, это...

Ограничения на обобщённый интерфейс
Здравствуйте, такой вопрос если я создаю обобщённый класс с ограничением на обобщённый интерфейс,...

Как объяснить компилятору, что коллекция может работать с объектами реализующими обобщенный интерфейс IComparable<T>
Привет! Помогите пожалуйста разобраться. Как объяснить компилятору, что коллекция может работать...

Почему некоторые типы реализуют сразу и обобщенный вариант интерфейса и не обобщенный?
Почему некоторые типы в c# реализуют сразу и обобщенный вариант интерфейса и не обобщенный,...

5
6 / 6 / 4
Регистрация: 23.11.2014
Сообщений: 23
26.11.2014, 22:29 2
упс
C#
1
a2 A2 =( (a<a2>) A ).GetNameObj();
это контрвариантноть вроде
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
26.11.2014, 22:41 3
Лучший ответ Сообщение было отмечено bazyzy как решение

Решение

Цитата Сообщение от bazyzy Посмотреть сообщение
почему метод GetNameObj возвращает объект типа a1 если ему как через конструктор, так и через параметр типа передают a2.
Потому что в коде вы проверяете имя типа параметра, а не объекта, на который ссылается переменная этого типа. Вариантность тут вообще не при делах.
Чтобы не путаться с обобщениями, примерно вот так выглядит ваш класс с точки зрения рантайма:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
class b_a2 : a_a2
{
    a2 t;
    public b(a2 o)
    {
        t = o;
    }
    public a2 GetNameObj()
    {
        Console.WriteLine(typeof(a2).Name);
        return t;
    }
}
Как видите, там всегда будет имя типа параметра, вне зависимости от конкретного типа объекта, на который ссылается ваша переменная.

Если хотите получить конкретный тип объекта, то вместо typeof(T) используйте t.GetType()
1
6 / 6 / 4
Регистрация: 23.11.2014
Сообщений: 23
26.11.2014, 22:58 4
Кажется дело в версии платформы под 4 и выше все работает и typeof и gettype всмысле структура обобщений, а вот ниже помогает только ручное преобразование
0
Эксперт .NET
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
26.11.2014, 23:07 5
Цитата Сообщение от mr_duke Посмотреть сообщение
под 4 и выше все работает и typeof и gettype всмысле структура обобщений
Вы, наверное, что-то путаете. typeof и GetType — это не совсем одно и то же. typeof работает на типе, а GetType — на объекте. typeof(T), где Т — тип параметра, всегда вернет имя типа, с которым создан класс, в любой версии фреймворка, начиная с 2.0.
1
6 / 6 / 4
Регистрация: 23.11.2014
Сообщений: 23
26.11.2014, 23:09 6
ну я это и имел ввиду и t и T

Добавлено через 1 минуту
на 5 все норм в любом случае а2 дает
а на 3.5 typeof дает а1 а GetType вообще краш вызвал))))
0
26.11.2014, 23:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.11.2014, 23:09
Помогаю со студенческими работами здесь

Обобщенный и не обобщенный класс с одинаковым именем
Добрый день! Task&lt;int&gt; task = Task.Run(() =&gt; { Console.WriteLine(&quot;Foo&quot;); return 3; }); Как такое...

ковариантность
ковариантность позволяет использовать override метод, чья ссылка на сам объект принадлежит базовому...

Ковариантность и контрвариантность
Добрый день, в книге дошел до ковариантности и контравариантности и появился вопрос. Если с...

Ковариантность и контрвариантность
Обьясните по простому, на сколько это возможно, что такое Ковариантность и контрвариантность. Где...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru