Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Ковариантный тип Generic'а / 7 сообщений из 7, страница 1 из 1
11.10.2016, 06:45
    #39324164
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ковариантный тип Generic'а
при таком коде:
Код: c#
1.
2.
3.
4.
    public interface GenericClass<out T>
    {
        bool TryGetValue(int key, out T result);
    }


будет ошибка, так как ковариантный тип не может быть входным параметром для метода. Но ведь мой параметр OUT, а не INT.
почему такая несправедливость?
...
Рейтинг: 0 / 0
11.10.2016, 09:29
    #39324205
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ковариантный тип Generic'а
Roman Mejtes,

Потому что out T result компилится в ref T result . Понятие out есть лишь для компилятора.
Поэтому и ошибка.
...
Рейтинг: 0 / 0
11.10.2016, 09:36
    #39324211
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ковариантный тип Generic'а
hVosttRoman Mejtes,

Потому что out T result компилится в ref T result . Понятие out есть лишь для компилятора.
Поэтому и ошибка.
тоска, печаль :) а если 3адуматься, было бы вполне логично.
...
Рейтинг: 0 / 0
11.10.2016, 09:38
    #39324212
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ковариантный тип Generic'а
Roman Mejtesтоска, печаль :) а если 3адуматься, было бы вполне логично.

Особой проблемы не вижу, оформляй TryGetValue, как расширение к интерфейсу, и всё
...
Рейтинг: 0 / 0
11.10.2016, 10:03
    #39324231
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ковариантный тип Generic'а
Roman Mejtes,
Also, variance is not allowed on a generic type parameter if an argument of that type is passed to a method by using the out or ref keyword. For example, the line of code below causes the compiler to generate the following error message:

Код: plaintext
Invalid variance: The type parameter 'T' must be invariantly valid on 'SomeDelegate<T>. Invoke(ref T)'. 'T' is contravariant. delegate void SomeDelegate<in T>(ref T t);

Код: c#
1.
delegate void SomeDelegate<in T>(ref T t);



Рихтер, CLR via C#, раздел Designing types, глава Generics, подраздел Delegate and Interface Contra-variant and Covariant Generic Type Arguments.
...
Рейтинг: 0 / 0
11.10.2016, 10:30
    #39324256
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ковариантный тип Generic'а
Вот здесь , кстати, есть хороший ответ Липперта, почему для ref/out-параметров запрещена вариация (это почему-то мало где разъяняется). В двух словах - потому что они по сути своей одновременно являются и out, и in.
...
Рейтинг: 0 / 0
11.10.2016, 10:37
    #39324263
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ковариантный тип Generic'а
Сон Веры Павловны Вот здесь , кстати, есть хороший ответ Липперта, почему для ref/out-параметров запрещена вариация (это почему-то мало где разъяняется). В двух словах - потому что они по сути своей одновременно являются и out, и in.

Это разбег между C# и CLR.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Ковариантный тип Generic'а / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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