Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|||||||||||
1 | |||||||||||
Синтаксический сахар. Уточнение второго и последующих типов дженерика03.02.2018, 17:10. Показов 1924. Ответов 19
Доброго времени суток, Господа. Объясните мне пожалуйста, почему, когда я пишу вот такой класс:
Foo<T> , я могу не использовать уточнение типа T , и использовать его вот так:Foo(3); - где T выведет за меня компилятор из параметра, и он будет равен int А при использовании вот такой метода:
Foo<string>(3); - компилятор не может вывести тип TArgs из параметра метода, и просит, чтобы я его уточнил, то есть написал вот так: Foo<string, int>(3); Просто помню в C++ так можно делать, здесь нет. Может кто знает, как решить проблему?
0
|
03.02.2018, 17:10 | |
Ответы с готовыми решениями:
19
Синтаксический сахар, и каналы Синтаксический сахар для for Синтаксический сахар, фичи и полезности C# 6.0 под .Net 4.6 С# синтаксический сахар. Убрать ";" и "{}" |
17793 / 12944 / 3381
Регистрация: 17.09.2011
Сообщений: 21,226
|
||||||
03.02.2018, 17:25 | 2 | |||||
Почему же не можете? Можете конечно.
Добавлено через 2 минуты Потому что у вас нигде не объявлен метод с одним типом-параметром.
0
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
03.02.2018, 17:26 [ТС] | 3 |
kolorotur,
А я и не сказал, что не могу
Да, разные. Тоесть, Вы хотите сказать, что в C# никак не сделать так, чтобы те типы, которые по идее компилятор мог бы вывести из аргументов, не задавать?
0
|
17793 / 12944 / 3381
Регистрация: 17.09.2011
Сообщений: 21,226
|
|
03.02.2018, 17:51 | 4 |
А, прошу прощения — прочитал "я могу не" как "я не могу"
При вызове метода нужно либо не указывать типы-параметры вообще и позволить компилятору их определить по аргументам, либо указывать все параметры.
0
|
2082 / 1573 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|
03.02.2018, 18:14 | 5 |
В С++ шаблоны которые инстанциируются при компляции. А здесь не рыба ни мясо времени выполнения которое по определению не может иметь ни гибкости ни скорости, а соответственно и таких финтов потому что они в рантайме происходят а не в компайлтайме.
Ну ты же знаешь что я тебе отвечу по поводу того какой есть единственный способ ни в чем себя не ограничивать?
0
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
03.02.2018, 18:25 [ТС] | 6 |
Fulcrum_013,
Не, дженерики тоже при компиляции происходят. Только они сильно ограничены
Конечно знаю Ща, еще немного на C# посижу, и опять C++
0
|
Администратор
|
|
03.02.2018, 18:53 | 7 |
Не совсем. При компиляции генерируется один IL код который на этапе исполнения превращается JIT-компилятором в разный код для разных тип-аргументов. В C++ же все делается на этапе компиляции. Отсюда и вытекают ограичения C# generics против C++ templates.
1
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
03.02.2018, 19:02 [ТС] | 8 |
OwenGlendower,
А можете по подробнее об этом? Почему JIT компилятор компилит в разный код для разных тип-аргументов?
0
|
17793 / 12944 / 3381
Регистрация: 17.09.2011
Сообщений: 21,226
|
|
03.02.2018, 19:14 | 9 |
Потому что идея дженериков в том, что они могут работать с любыми типами, а не только с теми, для которых компилятор "наклонировал" конкретных реализаций из сырцов, как это делается в плюсах.
1
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
03.02.2018, 19:20 [ТС] | 10 |
Ну это понятно же. Тоесть компилятор производит инстанцирование дженерика. Как я понимаю, в C# тоже будет так, что если ниразу метод, который имеет дженерик, не будет нигде использован, то он и не будет инстанцирован? На C++ так
0
|
17793 / 12944 / 3381
Регистрация: 17.09.2011
Сообщений: 21,226
|
|
03.02.2018, 19:28 | 11 |
Не совсем.
В плюсах компилятор находит все использования шаблонов в коде и генерирует соответствующие перегрузки обычных методов. Потому они и выглядят более гибкими — по сути это обычный механизм найти/заменить. В шарпе компилятор генерирует один универсальный метод, вне зависимости от того, используется он или нет. Конкретные реализации под конкретные типы генерируются уже в рантайме, потому что метод может быть динамически задействован с типами, о которых компилятор может ничего не знать на стадии компиляции (из динамически подгружаемых библиотек а-ля плагины, например).
1
|
2082 / 1573 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|||||||||||
03.02.2018, 19:29 | 12 | ||||||||||
Для С# главный вопрос какой компилятор. Это JIT - т.е. та штукенция которая докомпилирует байт-код в машкод в рантайме. Как результат дженерики не понимают к примеру применение операторов к обобщенным типам. т.е. вот так
1
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
03.02.2018, 19:37 [ТС] | 13 |
kolorotur, Стоит их вообще юзать то? Сильно ли они на производительность давят?
Fulcrum_013, Не по теме: Ты че C# начал изучать?:D
0
|
17793 / 12944 / 3381
Регистрация: 17.09.2011
Сообщений: 21,226
|
|
03.02.2018, 19:51 | 14 |
Стоит ли в плюсах шаблоны юзать?
На производительность давит первый вызов, т.к. метод под конкретный тип генерируется. Потом — как обычный вызов метода.
1
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
03.02.2018, 19:53 [ТС] | 15 |
kolorotur,
Конечно! Это очень мощная вещь. Которая никак не влияет на производительность, делает код более лаконичнее. Шаблоны - это новый C++
Понял. Спасибо
0
|
17793 / 12944 / 3381
Регистрация: 17.09.2011
Сообщений: 21,226
|
|
03.02.2018, 20:04 | 16 |
Тот же ответ применим и к шарпу, с той только разницей, что в нем имеется небольшая просадка в производительности при первом вызове в угоду настоящей универсальности.
0
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
03.02.2018, 20:06 [ТС] | 17 |
kolorotur, Ну их не так часто применяешь в C#, так как они не такие мощные, как в C++
0
|
Администратор
|
|
03.02.2018, 21:09 | 18 |
Потому что в 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,
Только в этом разница между 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 | |
04.02.2018, 08:10 | |
Помогаю со студенческими работами здесь
20
Как предотвратить выдачу второго и последующих сообщений при поиске подстроки в строке? Константные и не константные ссылки. Приведения типов. Нужно уточнение Компаратор для дженерика Сортировка List<T> с использованием дженерика Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Блоги программистов | |||||
Обновление сайта www.historian.by
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, и это не случайно. Этот язык программирования обладает множеством преимуществ, которые делают его. . .
|