С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
1

Синтаксический сахар. Уточнение второго и последующих типов дженерика

03.02.2018, 17:10. Показов 1924. Ответов 19

Author24 — интернет-сервис помощи студентам
Доброго времени суток, Господа. Объясните мне пожалуйста, почему, когда я пишу вот такой класс:
C#
1
2
3
4
5
6
class SomeClass
{
    public void Foo<T>(T arg)
    {
    }
}
то при использовании метода Foo<T>, я могу не использовать уточнение типа T, и использовать его вот так:
Foo(3); - где T выведет за меня компилятор из параметра, и он будет равен int
А при использовании вот такой метода:
C#
1
2
3
4
5
6
class SomeClass
{
    public void Foo<T, TArgs>(TArgs args)
    {
    }
}
Я уже не могу написать вот так:
Foo<string>(3); - компилятор не может вывести тип TArgs из параметра метода, и просит, чтобы я его уточнил, то есть написал вот так: Foo<string, int>(3);

Просто помню в C++ так можно делать, здесь нет. Может кто знает, как решить проблему?
0
Programming
Эксперт
9485 / 562 / 19
Регистрация: 12.04.2006
Сообщений: 11,671
Блог
03.02.2018, 17:10
Ответы с готовыми решениями:

Синтаксический сахар, и каналы
Hello World! 1: Обьясните пожалуйста разницу между конструкциями func foo() &lt;-chan int { return...

Синтаксический сахар для for
структура for_each предельная понятна, но как sort для базовых типов получается только два...

Синтаксический сахар, фичи и полезности C# 6.0 под .Net 4.6
Недавно зарелизилась новая студия 2015, а вместе с ней и язык программирования C# до 6 версии....

С# синтаксический сахар. Убрать ";" и "{}"
Добрый день. Странные у меня претензии, знаю) В общем, поучил немного F# и теперь хочу что бы в...

19
Эксперт .NET
17793 / 12944 / 3381
Регистрация: 17.09.2011
Сообщений: 21,226
03.02.2018, 17:25 2
Цитата Сообщение от Bretbas Посмотреть сообщение
при использовании метода Foo<T>, я могу не использовать уточнение типа T, и использовать его вот так:
Foo(3); - где T выведет за меня компилятор из параметра, и он будет равен int
Почему же не можете? Можете конечно.

C#
1
2
3
4
5
void Foo<T>(T arg)
{
}
 
Foo(3); // OK
Цитата Сообщение от Bretbas Посмотреть сообщение
Просто помню в C++ так можно делать, здесь нет.
Шаблоны в плюсах и универсальные типы в шарпе — очень сильно разные вещи.

Добавлено через 2 минуты
Цитата Сообщение от Bretbas Посмотреть сообщение
Я уже не могу написать вот так:
Foo<string>(3); - компилятор не может вывести тип TArgs из параметра метода, и просит, чтобы я его уточнил, то есть написал вот так: Foo<string, int>(3);
Потому что у вас нигде не объявлен метод с одним типом-параметром.
0
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
03.02.2018, 17:26  [ТС] 3
kolorotur,
Цитата Сообщение от kolorotur Посмотреть сообщение
Почему же не можете? Можете конечно.
А я и не сказал, что не могу
Цитата Сообщение от Bretbas Посмотреть сообщение
то при использовании метода Foo<T>, я могу не использовать уточнение типа T
Цитата Сообщение от kolorotur Посмотреть сообщение
Шаблоны в плюсах и универсальные типы в шарпе — очень сильно разные вещи.
Да, разные. Тоесть, Вы хотите сказать, что в C# никак не сделать так, чтобы те типы, которые по идее компилятор мог бы вывести из аргументов, не задавать?
0
Эксперт .NET
17793 / 12944 / 3381
Регистрация: 17.09.2011
Сообщений: 21,226
03.02.2018, 17:51 4
Цитата Сообщение от Bretbas Посмотреть сообщение
А я и не сказал, что не могу
А, прошу прощения — прочитал "я могу не" как "я не могу"

Цитата Сообщение от Bretbas Посмотреть сообщение
Вы хотите сказать, что в C# никак не сделать так, чтобы те типы, которые по идее компилятор мог бы вывести из аргументов, не задавать?
При вызове метода нужно либо не указывать типы-параметры вообще и позволить компилятору их определить по аргументам, либо указывать все параметры.
0
2082 / 1573 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
03.02.2018, 18:14 5
Цитата Сообщение от Bretbas Посмотреть сообщение
Просто помню в C++ так можно делать, здесь нет.
В С++ шаблоны которые инстанциируются при компляции. А здесь не рыба ни мясо времени выполнения которое по определению не может иметь ни гибкости ни скорости, а соответственно и таких финтов потому что они в рантайме происходят а не в компайлтайме.
Цитата Сообщение от Bretbas Посмотреть сообщение
Может кто знает, как решить проблему?
Ну ты же знаешь что я тебе отвечу по поводу того какой есть единственный способ ни в чем себя не ограничивать?
0
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
03.02.2018, 18:25  [ТС] 6
Fulcrum_013,
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
А здесь не рыба ни мясо времени выполнения которое по определению не может иметь ни гибкости ни скорости, а соответственно и таких финтов потому что они в рантайме происходят а не в компайлтайме.
Не, дженерики тоже при компиляции происходят. Только они сильно ограничены

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Ну ты же знаешь что я тебе отвечу по поводу того какой есть единственный способ ни в чем себя не ограничивать?
Конечно знаю Ща, еще немного на C# посижу, и опять C++
0
Администратор
Эксперт .NET
17711 / 13838 / 5313
Регистрация: 17.03.2014
Сообщений: 28,344
Записей в блоге: 1
03.02.2018, 18:53 7
Цитата Сообщение от Bretbas Посмотреть сообщение
Не, дженерики тоже при компиляции происходят.
Не совсем. При компиляции генерируется один IL код который на этапе исполнения превращается JIT-компилятором в разный код для разных тип-аргументов. В C++ же все делается на этапе компиляции. Отсюда и вытекают ограичения C# generics против C++ templates.
1
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
03.02.2018, 19:02  [ТС] 8
OwenGlendower,
Цитата Сообщение от OwenGlendower Посмотреть сообщение
превращается JIT-компилятором в разный код для разных тип-аргументов
А можете по подробнее об этом? Почему JIT компилятор компилит в разный код для разных тип-аргументов?
0
Эксперт .NET
17793 / 12944 / 3381
Регистрация: 17.09.2011
Сообщений: 21,226
03.02.2018, 19:14 9
Цитата Сообщение от Bretbas Посмотреть сообщение
Почему JIT компилятор компилит в разный код для разных тип-аргументов?
Потому что идея дженериков в том, что они могут работать с любыми типами, а не только с теми, для которых компилятор "наклонировал" конкретных реализаций из сырцов, как это делается в плюсах.
1
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
03.02.2018, 19:20  [ТС] 10
Цитата Сообщение от kolorotur Посмотреть сообщение
Потому что идея дженериков в том, что они могут работать с любыми типами, а не только с теми, для которых компилятор "наклонировал" конкретных реализаций из сырцов, как это делается в плюсах.
Ну это понятно же. Тоесть компилятор производит инстанцирование дженерика. Как я понимаю, в C# тоже будет так, что если ниразу метод, который имеет дженерик, не будет нигде использован, то он и не будет инстанцирован? На C++ так
0
Эксперт .NET
17793 / 12944 / 3381
Регистрация: 17.09.2011
Сообщений: 21,226
03.02.2018, 19:28 11
Цитата Сообщение от Bretbas Посмотреть сообщение
Тоесть компилятор производит инстанцирование дженерика.
Не совсем.
В плюсах компилятор находит все использования шаблонов в коде и генерирует соответствующие перегрузки обычных методов. Потому они и выглядят более гибкими — по сути это обычный механизм найти/заменить.
В шарпе компилятор генерирует один универсальный метод, вне зависимости от того, используется он или нет.
Конкретные реализации под конкретные типы генерируются уже в рантайме, потому что метод может быть динамически задействован с типами, о которых компилятор может ничего не знать на стадии компиляции (из динамически подгружаемых библиотек а-ля плагины, например).
1
2082 / 1573 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
03.02.2018, 19:29 12
Цитата Сообщение от Bretbas Посмотреть сообщение
Тоесть компилятор производит инстанцирование дженерика
Для С# главный вопрос какой компилятор. Это JIT - т.е. та штукенция которая докомпилирует байт-код в машкод в рантайме. Как результат дженерики не понимают к примеру применение операторов к обобщенным типам. т.е. вот так
C#
1
2
3
4
T add<T>(T lhs, T rhs)
{
    return lhs + rhs;
}
дженерики не могут. Если даже это обойти
C#
1
2
3
4
5
6
T add<T>(T lhs, T rhs)
{
    dynamic l = lhs;
    dynamic r = rhs;
    return (T)(l + r)  
}
то при отсутствии оператора + для типа T ошибка будет в рантайме а не в компайл тайме. Т.е. дженерики это фактически средство включения динамической типизации а не средство метапрограммирования.
1
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
03.02.2018, 19:37  [ТС] 13
kolorotur, Стоит их вообще юзать то? Сильно ли они на производительность давят?

Fulcrum_013,

Не по теме:

Ты че C# начал изучать?:D

0
Эксперт .NET
17793 / 12944 / 3381
Регистрация: 17.09.2011
Сообщений: 21,226
03.02.2018, 19:51 14
Цитата Сообщение от Bretbas Посмотреть сообщение
Стоит их вообще юзать то?
Стоит ли в плюсах шаблоны юзать?

Цитата Сообщение от Bretbas Посмотреть сообщение
Сильно ли они на производительность давят?
На производительность давит первый вызов, т.к. метод под конкретный тип генерируется.
Потом — как обычный вызов метода.
1
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
03.02.2018, 19:53  [ТС] 15
kolorotur,
Цитата Сообщение от kolorotur Посмотреть сообщение
Стоит ли в плюсах шаблоны юзать?
Конечно! Это очень мощная вещь. Которая никак не влияет на производительность, делает код более лаконичнее. Шаблоны - это новый C++

Цитата Сообщение от kolorotur Посмотреть сообщение
На производительность давит первый вызов, т.к. метод под конкретный тип генерируется.
Потом — как обычный вызов метода.
Понял. Спасибо
0
Эксперт .NET
17793 / 12944 / 3381
Регистрация: 17.09.2011
Сообщений: 21,226
03.02.2018, 20:04 16
Цитата Сообщение от Bretbas Посмотреть сообщение
Конечно!
Тот же ответ применим и к шарпу, с той только разницей, что в нем имеется небольшая просадка в производительности при первом вызове в угоду настоящей универсальности.
0
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
03.02.2018, 20:06  [ТС] 17
kolorotur, Ну их не так часто применяешь в C#, так как они не такие мощные, как в C++
0
Администратор
Эксперт .NET
17711 / 13838 / 5313
Регистрация: 17.03.2014
Сообщений: 28,344
Записей в блоге: 1
03.02.2018, 21:09 18
Цитата Сообщение от Bretbas Посмотреть сообщение
Почему JIT компилятор компилит в разный код для разных тип-аргументов?
Потому что в C# есть деление на значимые и ссылочные типы с которыми нужно обращаться по разному. На деле правило "разный код для разных тип-аргументов" имеет уточнения. Для разных ссылочных типов код будет один. Для разных значимых свой отдельный код. То есть если в приложении используется List<string>, List<WebClient>, List<int[]>, List<byte>, List<DateTime>, то на этапе исполнения мы получим 3 варианта кода: одие для всех ссылочных типов и по одному для byte и DateTime.
1
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
04.02.2018, 08:00  [ТС] 19
OwenGlendower,
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Потому что в C# есть деление на значимые и ссылочные типы с которыми нужно обращаться по разному. На деле правило "разный код для разных тип-аргументов" имеет уточнения. Для разных ссылочных типов код будет один. Для разных значимых свой отдельный код. То есть если в приложении используется List<string>, List<WebClient>, List<int[]>, List<byte>, List<DateTime>, то на этапе исполнения мы получим 3 варианта кода: одие для всех ссылочных типов и по одному для byte и DateTime.
Только в этом разница между C++ и C#? Ведь, как я понял, C++ компилит(можно сказать делает перегрузки для функций с разными параметрами тип-аргументов) на этапе компиляции. А C# на этапе компиляции JIT компилятором, тоесть только при запуске программы. Так вот, разница только в этом и в том, что C# генерирует разный код для ссылочных и ValueType типов? И все?
0
2082 / 1573 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
04.02.2018, 08:10 20
Bretbas, Да именно так. Это всего лишь средство пользования строгой динамической типизации и не более.
0
04.02.2018, 08:10
cpp_developer
Эксперт
20123 / 5690 / 417
Регистрация: 09.04.2010
Сообщений: 12,546
Блог
04.02.2018, 08:10
Помогаю со студенческими работами здесь

Как предотвратить выдачу второго и последующих сообщений при поиске подстроки в строке?
Есть код, который ищет в HTML слово, и если оно есть выдаёт сообщение... Проблема в том, что код...

Константные и не константные ссылки. Приведения типов. Нужно уточнение
Не очень понимаю в чем различие (2,3 строчки). int x = 10; double &amp;y = x; const double &amp;y...

Компаратор для дженерика
Добрый день. Пишу компаратор, который должен сортировать разные объекты (дженерики). Если для...

Сортировка List<T> с использованием дженерика
пробовал сделать по такому варианту: var Comparison: TComparison&lt;TMyRecord&gt;; .... Comparison...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Блоги программистов
Обновление сайта www.historian.b­y
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
Модель полного двоичного суматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list): s=^y] p=x and y for i in range(1,len(x)): s. append((x^y)^p) p=(x and y)or(p and (x or y)) return s x=list() y=list()
Это мы не проходили, это нам не задавали...(аси­­хронный счётчик с управляющим сигналом задержки).
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
Руководство по созданию бота для Телеграм на Python
IT_Exp 04.01.2025
Боты для Телеграм представляют собой автоматизированные программы, которые выполняют различные задачи, взаимодействуя с пользователями через интерфейс мессенджера. В данной статье мы рассмотрим,. . .
Применение компонентов PrimeVue в Vue.js 3 на TypeScript
BasicMan 04.01.2025
Введение в PrimeVue и настройка окружения PrimeVue представляет собой мощную библиотеку компонентов пользовательского интерфейса для Vue. js 3, которая предоставляет разработчикам богатый набор. . .
Как стать Senior developer
cpp_developer 04.01.2025
В современной индустрии разработки программного обеспечения позиция Senior Developer представляет собой не просто следующую ступень карьерной лестницы, а качественно новый уровень профессионального. . .
Что известно о дате выхода Windows 12 и чего от нее ждать
IT_Exp 04.01.2025
В мире технологий постоянно происходят изменения, и операционные системы не являются исключением. Windows 11, выпущенная в октябре 2021 года, принесла множество инноваций и улучшений, но. . .
Что новенького в .NET Core 9
Programming 04.01.2025
Обзор ключевых изменений в . NET Core 9 Платформа . NET Core продолжает активно развиваться, и версия 9 представляет собой значительный шаг вперед в эволюции этой технологии. Новый релиз. . .
Инструкция по установке python3.13.1 в Debian 12
AlexSky-coder 03.01.2025
sudo apt update sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget. . .
Затестил триггеры. архив проекта прилагаю с GOA файлами в настройках архиватора проектов.
Hrethgir 03.01.2025
В этот раз нет закольцованности, потому что от неё только глюки, как я понял, логика не вырезанная. Триггеры очень быстрые если верить измерениям с помощью анализатора от Gowin. Есть ещё регистры,. . .
Python в помощь DevOps
IT_Exp 03.01.2025
Причины использования Python в работе DevOps Python стал неотъемлемой частью мира DevOps, и это не случайно. Этот язык программирования обладает множеством преимуществ, которые делают его. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru