C>означает словарь, у которого тип первого аргумента — object?
Не может не потому что это сложно, а потому что авто-вывод типа object в Nemerle вывели в отдельный вид ошибок. К object приводится почти всё, и при этом в большинстве случаев object совсем не то что хотел программист. Да и dictionary это частный случай, а вывод типов из использования работает в этом же стиле для любых generics, и внутри методов, и в локальных функциях, и т.д. Появление где-то внутри object, и последующее распространение object вверх и вниз по коду, приводило бы к ошибкам по понятности соперничающим с шаблонами C++
Если хочется именно object — достаточно в первой строчке сделать map.Add((object)100, 100.0); ну или объявить тип Dictionary как это обычно делается в C#. Вывод типов настолько всеобщий, что даже объявление типа внутри компилятора — своего рода подсказка для алгоритма вывода, а не что-то супер-жёсткое. Т.е. компилятор поймёт код в котором ты задашь только часть типов-ограничений для Dictionary (или любого другого дженерика):
и этот же механизм работает даже в объявлениях переменных:
mutable map : Dictionary[object, _] = null; //объявили переменную, у которой первый тип object, а второй неизвестно
map = Dictionary();//создали экземпляр, но пока не совсем понятно чего
map.Add(100, 100.0);//вот теперь ясно что тип Dictionary[object, double]
Вывод типов распространяется. Т.е. если бы этот массив возвращался из локальной функции, параметризированной типом TKey, то TKey стал бы int, и всё остальное бы вывелось и для мест откуда функцию вызвали, и в местах которые функция вызывает, а если бы не сошлось — была бы ошибка.
Ну и тот же вывод работает на любую глубину вложенности. Нет проблем вывести(или задать) тип Dictionary[MultiKey[_, long, object], List[_]]
Из-за того что вывод типов реализован в максимально общем виде — писать без типов получается офигенно. Например я здоровенные алгоритмы мог реализовывать, а потом проверял какой перфоманс они показывают на разных видах контейнеров, меняя буквально по одной строке в определённых местах.
Здравствуйте, varenikAA, Вы писали:
AA>Кто уже использует? Есть очевидные преимущества? Положительные чувства?
Ну есть приятные моменты.
Например, init-setter. Когда есть много свойств, большинство из них используются со значениями по-умолчанию, а после инициализации клиенту их менять нельзя. Раньше надо было делать конструктор с конским списком параметров. Сейчас клиент создавая дефолтным конструктором, проставляет нужные ему свойства как хочет.
Конструктор new() — двояко. С одной стороны, приятно писать. С другой — тяжело читать: myFile.Open(name, new ShareOptions(), new AccessOptions(), new CreateOptions()) превращается в myFile.Open(name, new(), new(), new())
Здравствуйте, Xander Zerge, Вы писали:
XZ>Конструктор new() — двояко. С одной стороны, приятно писать. С другой — тяжело читать: myFile.Open(name, new ShareOptions(), new AccessOptions(), new CreateOptions()) превращается в myFile.Open(name, new(), new(), new())
Да, new с тех пор как 3 года назад попробовал f# nemerle вообще напрягает.
Лучше бы разрешили без нью конструкторы вызывать.
Здравствуйте, varenikAA, Вы писали:
AA>Кто уже использует? Есть очевидные преимущества?
NRT наконец то стало можно пользоваться. В C# 8 реальные библиотеки на него перевести без использования оператора ! и хитрой магии на атрибутах даже в тривиальных местах не получалось. Ну и вывод типов к кторе тоже довольно полезен оказался. Разок relational pattern пригодился.
AA> Положительные чувства?
Здравствуйте, Codealot, Вы писали:
C>Так никто не заставляет это делать. С другой стороны, писать "readonly Dictionary<string, Func<T>> _handlers = new();" — намного удобнее, как и читать.
Здравствуйте, Xander Zerge, Вы писали:
XZ>Конструктор new() — двояко. С одной стороны, приятно писать. С другой — тяжело читать: myFile.Open(name, new ShareOptions(), new AccessOptions(), new CreateOptions()) превращается в myFile.Open(name, new(), new(), new())
Так никто не заставляет это делать. С другой стороны, писать "readonly Dictionary<string, Func<T>> _handlers = new();" — намного удобнее, как и читать.
Здравствуйте, varenikAA, Вы писали:
AA>Кто уже использует? Есть очевидные преимущества? Положительные чувства? AA>Если сейчас попробовать 5, то уже в ноябре нужно будет опять апгрейд делать до 6. AA>Но и на 3.1 вроде бы уже не хочется. AA>Смущают маленькие сроки LTS (всего 3 года).
Насколько я видел, в числе новшеств только всё новые синтаксические извращения, с такими делами у C# будущего нет, как и с WPF/UWP было — доделать как следует кривые места, и был б чудесный инструмент, но Microsoft этого не сделает никогда. Со времён async/await полтора полезных новшества и огромная куча синтаксических извращений.
Здравствуйте, varenikAA, Вы писали:
AA>но так тоже не лучше. ихмо. AA>
AA> Client client = new(1, "Alice"); // <= вместо var конкретный тип, бэд практик.
AA> WriteLine($"Hello, {client}!");
AA>
С одной стороны в любом случае конкретный тип.
Что они могли бы на самом деле сделать лучше — объявление мемберов в виде "var client = new Client();", в том же стиле как локальные переменные.
Кто уже использует? Есть очевидные преимущества? Положительные чувства?
Если сейчас попробовать 5, то уже в ноябре нужно будет опять апгрейд делать до 6.
Но и на 3.1 вроде бы уже не хочется.
Смущают маленькие сроки LTS (всего 3 года).
Здравствуйте, Codealot, Вы писали:
C>Так никто не заставляет это делать. С другой стороны, писать "readonly Dictionary<string, Func<T>> _handlers = new();" — намного удобнее, как и читать.
Не уверен, вот как вы к этому отнесетесь?
public record Client(int Id, string FullName);
WriteLine($"Hello, {(1,"Alice")}!");
UPD
Косанул. тупла получилась
но так тоже не лучше. ихмо.
Client client = new(1, "Alice"); // <= вместо var конкретный тип, бэд практик.
WriteLine($"Hello, {client}!");
Здравствуйте, varenikAA, Вы писали:
AA>Кто уже использует? Есть очевидные преимущества? Положительные чувства?
Итак, перевел старый кор-проект на 5-ку. впечатление очень приятное.
работа с рекордами сильно упростила. интересно код-стайл если в одном файле с клиентом накидал рекордов это норм?
ждем теперь улучшение скорости старта настольных/консольных приложений.
А по факту еще нужны варианты как в виде рекордов, так и в виде вариантов аргументов.
Ну и как ни крути все ЯП постепенно стремятся стать лиспом.
Здравствуйте, varenikAA, Вы писали:
AA>Кто уже использует? Есть очевидные преимущества? Положительные чувства?
Все еще не работает обрезка кода. впф начинает падать, кроме того в один файл почему-то не упакавался сиплюсный рантайм.
обрезка удалила всего 8 из 118МБ
Здравствуйте, Codealot, Вы писали:
R>>Работает, тип определяется из первого использования
C>А если остальные использования оказываются несовместимы с этим типом?
C>означает словарь, у которого тип первого аргумента — object?
В немерле, если аргументы сводятся к object — ошибка компиляции, и сделано это намеренно, в остальном случае типы могут уточнятся, насколько я помню. Если так нужен object, то либо специализируешь дженерики, либо так
map.Add(100:object, 100.0);
C# тебе тоже не даст вывести тип к общему типу, если общий тип — это object
Здравствуйте, VladCore, Вы писали:
VC>а сфера какая? если не обработка платежей по картам то на LTS все забивают.
не платежи, нет. вообще в целом впечатляет особенно записи.
плохо только с размером. 120МБ приложение. надо правда зипануть попробовать может ужмется в 10 раз.
а вот интересно клик-ванс уже умеет с логином-паролем подключаться по http?
все что раньше было это ftp user@pass