New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Запретить ограничение where T: System.Array и where T: Object. В C# именно так и сделано #1986
Comments
О, прелесть какая в C#:
Исправьте пожалуйста заголовок Issue |
Нет, подождите, при чём тут. Ограничение в виде
Я же говорю, проблема в том что компилятор добавляет лишний оператор Более того, эта фича очень нужна для OpenCLABC:
Эти методы создают новый массив типа И это вполне работает, с небольшим костылём. Вот в примере
Это работает и выводит правильный результат. А костыль заключается только в том, что
Вот это |
Меня радует, что Вы обратились к C#. Но здесь PascalABC.NET, а не C#, давайте не будем уходить в обсуждение C#. =) |
Зачем вы используете where, если можно написать так. Я бы тоже запретил спецификатор where T:Array |
OpenCL буфер может хранить массив любой размерности, одномерные это только пример.
В чём прикол запрещать всё подряд? Баг только с |
А, и, это всё только внутри функции:
После того как И если передать куда то внутри - тоже норм:
|
А зачем описывать генерик-функцию с ограничителем и писать кучу преобразований типов, если можно написать обычную? |
Я же говорю, там читает массив любой размерности, не только одномерный. Вот, ещё раз, тот кусок кода из OpenCLABC:
Это сейчас работает, так что не надо его ломать. |
Ну, здесь только одномерный создается. А TArray может быть многомерным. Мне теперь понятно, почему в C# это запрещено. Потому что очень много рефлексии будет, что конечно безобразие. Для каждой размерности надо писать свою перегруженную функцию. |
С чего вдруг?
Ничего подобного, она там не нужна, и как раз именно потому что можно сразу преобразовать к
А это ограничит макс кол-во измерений, что не хорошо. |
|
Ну и прекрасно, в C# вообще на много больше запрещено чем в паскале. Как статичные индексные свойства. А в этом запрете однозначно нет смысла (ну, кроме И главное, от того что сделаешь 100 перегрузок 1 функции - её универсальность всё равно будет на том же уровне что у шаблонной. |
И главное, всё это началось с того - что есть 1 мелкий баг. Если его исправить - всё остальное уже работает, ничего дописывать не придётся. Поэтому и запрещать не к чему. |
Я уверен, что в таком большом языке как C# это сделано не случайно. Видимо, есть серьёзные проблемы с ограничениями подобного рода. Все кроме Object здесь являются особыми типами, многообразные подтипы которых вмонтированы в синтаксис языка. Так что я думаю, что здесь надо запретить все эти типы пока не начали сыпаться худшие проблемы |
Хотя в C# 7.3 внезапно разрешили все ограничения кроме System.Array: |
Вот если будут - можно подумать о запрете. Но я уверен что их и не будет, потому что уже видно что оно всё работает!
Тем не менее. Все наследники Так же с делегатами - у них там То что это всё потихоньку разрешают - только показывает что они начали одумываться о тупых запретах. И - как я и сказал, в C# нельзя делать статичные индексные свойства. Вы думаете от них тоже что сыпаться будет? В C# полно тупых запретов, имеющих только примерные и надуманные причины. |
Умерьте свой пыл. Эмоции здесь ни к чему и ничего не изменят. Запретов хватает везде, но, давайте переведём диалог в более мирное русло.
То есть, Вы хотите, чтобы сначала делали, а потом думали? Может, стоит делать наоборот? |
Проверка боем! Этих ограничений в Net нет. А C# не единственный Net язык. А если делать наоборот, то по-моему вы подумали лишь о пути наименьшего сопротивления, но так и не нашли причины ограничений. |
Не согласен. Аналогия: сначала разрабатывается алгоритм решения задачи, потом она программируется. Наоборот не делается. Так и здесь. |
Это если разбираться. Считая что сказали разрабы выше - они на это время тратить не хотят. А если не разбираться - остаётся только тестировать. |
Аналогия: того, кто думает, что все заработает сразу, ждет сильное разочарование. |
Отладка вряд ли понадобится если что. Если что то будет сыпаться от такой конструкции - получим ошибку неправильного IL. Если в IL всё будет выглядеть правильно (что я сам за минуту могу проверить) - станет понятно что так делать просто нельзя. Но - я после создания этой issue прошёлся ещё по нескольким ситуациям (и не только тем что написал выше), и всё работает нормально. Проблема только с |
Вряд ли, я думаю не отсюда стоит ждать неприятностей. Скорее всего в каком-то другом месте с какой-то фичей что-то случиться. Но что об этом спорить, надо делать-мучаться, тогда и увидим. |
мда |
Конструкция where T: &Array должна быть запрещена, важный аргумент заключается в возможности обхода стандартной индексации с 0:
Здесь двумерный массив используется умышленно, так как для одномерных массивов индексирующихся не c 0, отведён специальный тип - T[*].
|
А в чём проблема? И
|
Ну так
|
Это уже, кстати, и в C# работает:
|
PascalABC.NET уже имеет один способ для обхода индексации, но это не значит что должен быть и второй. Во-вторых, Вы свернули с изначальной темы - про |
Нужен другой пример, показывающий, что ограничение where T: Array может приводить к некорректностям. Я пока такого не нашел. Пример с отрицательными индексами - он как раз и говорит, что CreateInstance - мощная и позволяет создавать массивы с отрицательными индексами. Именно так мы моделируем индексы в статических массивах |
Подчеркну, что эта возможность (CreateInstance) - не для повседневного использования, ровно как и механизм рефлексии. |
С пользовательскими типами воспроизвести не удалось.
Но я покопался в IL - похоже там добавляет лишний оператор
box
к типуTArray
The text was updated successfully, but these errors were encountered: