В превью версию C#13 добавили для так называемой `params` collections поддержку IEnumerable<T> и ReadOnlySpan<T>. Значит скоро можно будет писать вот так
ЗЫ. Из proposal вытекает, что поддерживаются также
* System.Span<T>
* System.Collections.Generic.IEnumerable<T>,
System.Collections.Generic.IReadOnlyCollection<T>,
System.Collections.Generic.IReadOnlyList<T>,
System.Collections.Generic.ICollection<T>,
System.Collections.Generic.IList<T>
* Класс или структура, который реализует IEnumerable, если есть доступный конструктор без аргументов, и экземплярный (не extension) метод Add.
* Класс или структура со статическим методом Create.
Здравствуйте, rameel, Вы писали:
R>В превью версию C#13 добавили для так называемой `params` collections поддержку IEnumerable<T> и ReadOnlySpan<T>. Значит скоро можно будет писать вот так R>
VD>>>>Не прошло и 20 лет! _FR>>>Прошло 😭
S>> Нет дженерики появились в 2005 году!
_FR>System.Collections.IEnumerable, например, тоже поддержали, что могли бы сделать и с самого начала.
На самом деле это еще тот геморрой при рефлексии обрабатывать все варианты. Да еще разные варианты с количество перегрузок методов.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
_FR>>System.Collections.IEnumerable, например, тоже поддержали, что могли бы сделать и с самого начала. S>На самом деле это еще тот геморрой при рефлексии обрабатывать все варианты. Да еще разные варианты с количество перегрузок методов.
Какие варианты и рефлексию вы имеете в виду? Можете пример показать? Как это связано с первой, второй или 13-той версией языка?
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, Serginio1, Вы писали:
_FR>>>System.Collections.IEnumerable, например, тоже поддержали, что могли бы сделать и с самого начала. S>>На самом деле это еще тот геморрой при рефлексии обрабатывать все варианты. Да еще разные варианты с количество перегрузок методов.
_FR>Какие варианты и рефлексию вы имеете в виду? Можете пример показать? Как это связано с первой, второй или 13-той версией языка?
Здравствуйте, Serginio1, Вы писали:
_FR>>>>System.Collections.IEnumerable, например, тоже поддержали, что могли бы сделать и с самого начала. S>>>На самом деле это еще тот геморрой при рефлексии обрабатывать все варианты. Да еще разные варианты с количество перегрузок методов. _FR>>Какие варианты и рефлексию вы имеете в виду? Можете пример показать? Как это связано с первой, второй или 13-той версией языка?
S> Вот у тебя есть имя метода и параметры. По этим данным надо найти реальный метод. S>.Net Core, AppDomain, WCF, RPC маршалинг по Tcp/Ip свой велосипед
Спасибо за очень понятное объяснение. Конечно, это всё объясняет.
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, Serginio1, Вы писали:
_FR>>>>>System.Collections.IEnumerable, например, тоже поддержали, что могли бы сделать и с самого начала. S>>>>На самом деле это еще тот геморрой при рефлексии обрабатывать все варианты. Да еще разные варианты с количество перегрузок методов. _FR>>>Какие варианты и рефлексию вы имеете в виду? Можете пример показать? Как это связано с первой, второй или 13-той версией языка?
S>> Вот у тебя есть имя метода и параметры. По этим данным надо найти реальный метод. S>>.Net Core, AppDomain, WCF, RPC маршалинг по Tcp/Ip свой велосипед
_FR>Спасибо за очень понятное объяснение. Конечно, это всё объясняет.
Да в целом-то всё понятно. Вот у нас есть некий object, а ещё — string methodName, плюс object[] arguments.
И хочется воспроизвести все нюансы перегрузки, реализованные в C#.
Внезапно выясняется, что когда мы видим в коде foo.bar(baz1, baz2), то там происходит много всяких подкапотных интересностей.
Начиная от того, что результат зависит не от фактических типов baz1 и baz2, а от формальных. А вот для foo важен как формальный тип, так и фактический.
Даже если выбросить из рассмотрения extension методы, ограничившись только экземплярными, то всё равно там чёрт ногу сломит. Далеко не всякий сходу скажет, что выведет такой код:
using System;
public class Program
{
public class Foo
{
public string bar(object a, string b) => "1";
public string bar(int a, object b) => "2";
public string bar(object a, object b) => "3";
public string bar<A>(A a, string b) => "4";
public string bar<B>(int a, B b) => "5";
public string bar(params object[] xs) => "6";
public string bar(int a, params string[] b) => "7";
}
public static void Main()
{
var foo = new Foo();
Console.WriteLine(foo.bar(42, "42"));
}
}
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>>> Вот у тебя есть имя метода и параметры. По этим данным надо найти реальный метод. S>>>.Net Core, AppDomain, WCF, RPC маршалинг по Tcp/Ip свой велосипед _FR>>Спасибо за очень понятное объяснение. Конечно, это всё объясняет. S>Да в целом-то всё понятно. Вот у нас есть некий object, а ещё — string methodName, плюс object[] arguments. S>И хочется воспроизвести все нюансы перегрузки, реализованные в C#. S>Внезапно выясняется, что когда мы видим в коде foo.bar(baz1, baz2), то там происходит много всяких подкапотных интересностей.
Да, там много сложностей и действительно задача "в самом общем виде" не самая простая. Но 1) заметно проще, чем у компилятора и 2) думаю, если не хочется самому это всё выписывать, можно воспользоваться тем, что компилятор создаёт для вызова метода с dynamic-параметрами, типа такого:
S>using System;
S>public class Program
S>{
S> public class Foo
S> {
S> public string bar(object a, string b) => "1";
S> public string bar(int a, object b) => "2";
S> public string bar(object a, object b) => "3";
S> public string bar<A>(A a, string b) => "4";
S> public string bar<B>(int a, B b) => "5";
S> public string bar(params object[] xs) => "6";
S> public string bar(int a, params string[] b) => "7";
S> }
public class Foo2
{
public static string bar(Foo foo, dynamic a, dynamic b) => foo.bar(a, b);
}
S> public static void Main()
S> {
S> var foo = new Foo();
S> Console.WriteLine(Foo2.bar(foo, 42, "42")); // Вызываем "наш" метод заместо искомого
S> }
S>}
Help will always be given at Hogwarts to those who ask for it.
_ _FR> public class Foo2 _FR> { _FR> public static string bar(Foo foo, dynamic a, dynamic b) => foo.bar(a, b); _FR> }
Но пишем то мы универсальный код. Конечно можно динамически скомпилировать.
В той же статье для эвентов генерируется и компилируется код.
Но геморроя добавляется.
и солнце б утром не вставало, когда бы не было меня
_FR>> public class Foo2
_FR>> {
_FR>> public static string bar(Foo foo, dynamic a, dynamic b) => foo.bar(a, b);
_FR>> }
S> Но пишем то мы универсальный код. Конечно можно динамически скомпилировать. S>В той же статье для эвентов генерируется и компилируется код. S> Но геморроя добавляется.
Здравствуйте, Sinclair, Вы писали:
S>Далеко не всякий сходу скажет, что выведет такой код:
S> public string bar(object a, string b) => "1"; S> public string bar(int a, object b) => "2"; S> public string bar(object a, object b) => "3"; S> public string bar<A>(A a, string b) => "4"; S> public string bar<B>(int a, B b) => "5"; S> public string bar(params object[] xs) => "6"; S> public string bar(int a, params string[] b) => "7";
"Ваш код — $#$$%!" (ц) Ванко
Если человек(!!) не может сказать, что выведет компилятор (я угадал — 7), то и КОМПИЛЯТОР НЕ ДОЛЖЕН!
Машина не должна делать то, что человек не в состоянии осмыслить (например, тупые "нейронные сети").
Если ты наоверлоадил и некоторые методы схожи вплоть до неявной конверсии типов, это ПЛОХОЙ оверлоадинг и надо решать задачу по-другому или убирать неоднозначный оверлоадинг.
Это классика тупого поведения микрософта: думать за юзера больше, чем хочет сам юзер. Это программирование, точная наука! Здесь "я программист, я знаю как юзеру лучше!" не работает.
Лучше прогер напишет лишний символ/приведение типов/etc, чем компилятор распухнет от "хардкоженных догадок" и потом люди будут долго медитировать над тем, почему очевидный код ведёт себя криво.
Простота — залог надёжности.
Здравствуйте, rameel, Вы писали:
R>В превью версию C#13 добавили для так называемой `params` collections поддержку IEnumerable<T> и ReadOnlySpan<T>. Значит скоро можно будет писать вот так R>
Ну добавили финтифлюшку и что от этого изменилось? Теперь быстрее программы писать будете?
Я к 40 годам начал смотреть на суть. Когда будет возможно сделать библиотеку на C#, которую можно будет использовать из любого ЯП на всех шести операционных системах/платформах, доступных человечеству?
Здравствуйте, Shmj, Вы писали:
S>Здравствуйте, rameel, Вы писали:
R>>В превью версию C#13 добавили для так называемой `params` collections поддержку IEnumerable<T> и ReadOnlySpan<T>. Значит скоро можно будет писать вот так R>>
R>>https://x.com/jcouv/status/1767967748259545522
S>Ну добавили финтифлюшку и что от этого изменилось? Теперь быстрее программы писать будете?
S>Я к 40 годам начал смотреть на суть. Когда будет возможно сделать библиотеку на C#, которую можно будет использовать из любого ЯП на всех шести операционных системах/платформах, доступных человечеству?
.Native AOT. Только зачем? В том же .Net в большинстве случаев отказываются от P/Invoke
Так или иначе в .Native AOT Il сначала транслируется в С++, затем с помощью С++ компиляторов генерится машинный код со сборщиком мусора.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S> .Native AOT.
iOS и Android: Официально не поддерживаются для Native AOT на данный момент. Для мобильных платформ используются другие технологии, такие как Xamarin/MAUI.
WebAssembly: Не поддерживается напрямую Native AOT. Для работы с WebAssembly используется Blazor и связанный с ним стек.
Т.е. не возможно для всех ОС — и ты хоть обвешай себя разными финтифлюшками — когда нет фундамента дома — бесполезно делать рюшечки на ставнях.
S> Только зачем?
Чтобы переиспользовать код — вынести код в библиотеку и использовать один и тот же код на всех платформах, коих у человечества ровно шесть штук:
Здравствуйте, Shmj, Вы писали:
S>> .Native AOT.
S>
S>iOS и Android: Официально не поддерживаются для Native AOT на данный момент. Для мобильных платформ используются другие технологии, такие как Xamarin/MAUI.
S>WebAssembly: Не поддерживается напрямую Native AOT. Для работы с WebAssembly используется Blazor и связанный с ним стек.
S>Т.е. не возможно для всех ОС — и ты хоть обвешай себя разными финтифлюшками — когда нет фундамента дома — бесполезно делать рюшечки на ставнях.
S>> Только зачем?
S>Чтобы переиспользовать код — вынести код в библиотеку и использовать один и тот же код на всех платформах, коих у человечества ровно шесть штук:
S>1. Windows. S>2. Linux. S>3. MacOS. S>4. Android. S>5. iOS. S>6. WASM.