Новости C#13. params
От: rameel https://github.com/rsdn/CodeJam
Дата: 14.03.24 15:44
Оценка: 157 (4) +1
В превью версию C#13 добавили для так называемой `params` collections поддержку IEnumerable<T> и ReadOnlySpan<T>. Значит скоро можно будет писать вот так
void M(params IEnumerable<int> numbers);
void M(params ReadOnlySpan<int> numbers);


https://x.com/jcouv/status/1767967748259545522

ЗЫ. Из 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.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re: Новости C#13. params
От: dmitry_npi Россия  
Дата: 14.03.24 19:15
Оценка: +1
Здравствуйте, rameel, Вы писали:

R>В превью версию C#13 добавили для так называемой `params` collections поддержку IEnumerable<T> и ReadOnlySpan<T>.


Конечно, давно пора. Хотя мне казалось, что params IEnumerable уже давно ввели. Это же естественно.
Атмосферная музыка — www.aventuel.net
Re: Новости C#13. params
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.03.24 17:24
Оценка:
Здравствуйте, rameel, Вы писали:

R>В превью версию C#13 добавили для так называемой `params` collections поддержку IEnumerable<T> и ReadOnlySpan<T>. Значит скоро можно будет писать вот так

R>
R>void M(params IEnumerable<int> numbers);
R>void M(params ReadOnlySpan<int> numbers);
R>


Не прошло и 20 лет!
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Новости C#13. params
От: _FRED_ Черногория
Дата: 28.03.24 21:44
Оценка: +1
Здравствуйте, VladD2, Вы писали:

R>>void M(params IEnumerable<int> numbers);

VD>Не прошло и 20 лет!

Прошло 😭
Help will always be given at Hogwarts to those who ask for it.
Re[3]: Новости C#13. params
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 29.03.24 10:08
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, VladD2, Вы писали:


_FR>
R>>>void M(params IEnumerable<int> numbers);
_FR>

VD>>Не прошло и 20 лет!

_FR>Прошло 😭


Нет дженерики появились в 2005 году!
и солнце б утром не вставало, когда бы не было меня
Re[4]: Новости C#13. params
От: _FRED_ Черногория
Дата: 29.03.24 10:29
Оценка:
Здравствуйте, Serginio1, Вы писали:

R>>>>void M(params IEnumerable<int> numbers);

VD>>>Не прошло и 20 лет!
_FR>>Прошло 😭

S> Нет дженерики появились в 2005 году!


System.Collections.IEnumerable, например, тоже поддержали, что могли бы сделать и с самого начала.
Help will always be given at Hogwarts to those who ask for it.
Re[5]: Новости C#13. params
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 29.03.24 10:44
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>
R>>>>>void M(params IEnumerable<int> numbers);
_FR>

VD>>>>Не прошло и 20 лет!
_FR>>>Прошло 😭

S>> Нет дженерики появились в 2005 году!


_FR>System.Collections.IEnumerable, например, тоже поддержали, что могли бы сделать и с самого начала.


На самом деле это еще тот геморрой при рефлексии обрабатывать все варианты. Да еще разные варианты с количество перегрузок методов.
и солнце б утром не вставало, когда бы не было меня
Re[6]: Новости C#13. params
От: _FRED_ Черногория
Дата: 29.03.24 11:23
Оценка:
Здравствуйте, Serginio1, Вы писали:

_FR>>System.Collections.IEnumerable, например, тоже поддержали, что могли бы сделать и с самого начала.

S>На самом деле это еще тот геморрой при рефлексии обрабатывать все варианты. Да еще разные варианты с количество перегрузок методов.

Какие варианты и рефлексию вы имеете в виду? Можете пример показать? Как это связано с первой, второй или 13-той версией языка?
Help will always be given at Hogwarts to those who ask for it.
Re[7]: Новости C#13. params
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 29.03.24 11:33
Оценка: :)
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, Serginio1, Вы писали:


_FR>>>System.Collections.IEnumerable, например, тоже поддержали, что могли бы сделать и с самого начала.

S>>На самом деле это еще тот геморрой при рефлексии обрабатывать все варианты. Да еще разные варианты с количество перегрузок методов.

_FR>Какие варианты и рефлексию вы имеете в виду? Можете пример показать? Как это связано с первой, второй или 13-той версией языка?


Вот у тебя есть имя метода и параметры. По этим данным надо найти реальный метод.
.Net Core, AppDomain, WCF, RPC маршалинг по Tcp/Ip свой велосипед
и солнце б утром не вставало, когда бы не было меня
Re[8]: Новости C#13. params
От: _FRED_ Черногория
Дата: 29.03.24 11:50
Оценка: 6 (1) +1
Здравствуйте, 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.
Re[9]: Новости C#13. params
От: Sinclair Россия https://github.com/evilguest/
Дата: 14.06.24 19:52
Оценка: 14 (1) +2
Здравствуйте, _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"));
    }
}
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[10]: Новости C#13. params
От: _FRED_ Черногория
Дата: 04.07.24 08:26
Оценка:
Здравствуйте, 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.
Re[11]: Новости C#13. params
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 04.07.24 09:40
Оценка:
Здравствуйте, _FRED_, Вы писали:

_
_FR> public class Foo2
_FR> {
_FR> public static string bar(Foo foo, dynamic a, dynamic b) => foo.bar(a, b);
_FR> }

Но пишем то мы универсальный код. Конечно можно динамически скомпилировать.
В той же статье для эвентов генерируется и компилируется код.
Но геморроя добавляется.
и солнце б утром не вставало, когда бы не было меня
Re[12]: Новости C#13. params
От: _FRED_ Черногория
Дата: 04.07.24 09:58
Оценка: 7 (1) +1
Здравствуйте, Serginio1, Вы писали:

_FR>>      public class Foo2
_FR>>      {
_FR>>         public static string bar(Foo foo, dynamic a, dynamic b) => foo.bar(a, b);
_FR>>      }


S> Но пишем то мы универсальный код. Конечно можно динамически скомпилировать.

S>В той же статье для эвентов генерируется и компилируется код.
S> Но геморроя добавляется.

Так посмотрите во что компилятор это превращает:
    public class Foo2
    {
        [CompilerGenerated]
        private static class <>o__0
        {
            public static CallSite<Func<CallSite, Foo, object, object, object>> <>p__0;

            public static CallSite<Func<CallSite, object, string>> <>p__1;
        }

        [NullableContext(1)]
        public static string bar(Foo foo, [Dynamic] object a, [Dynamic] object b)
        {
            if (<>o__0.<>p__1 == null)
            {
                <>o__0.<>p__1 = CallSite<Func<CallSite, object, string>>.Create(Microsoft.CSharp.RuntimeBinder.Binder.Convert(CSharpBinderFlags.None, typeof(string), typeof(Foo2)));
            }
            Func<CallSite, object, string> target = <>o__0.<>p__1.Target;
            CallSite<Func<CallSite, object, string>> <>p__ = <>o__0.<>p__1;
            if (<>o__0.<>p__0 == null)
            {
                Type typeFromHandle = typeof(Foo2);
                CSharpArgumentInfo[] array = new CSharpArgumentInfo[3];
                array[0] = CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.UseCompileTimeType, null);
                array[1] = CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null);
                array[2] = CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null);
                <>o__0.<>p__0 = CallSite<Func<CallSite, Foo, object, object, object>>.Create(Microsoft.CSharp.RuntimeBinder.Binder.InvokeMember(CSharpBinderFlags.None, "bar", null, typeFromHandle, array));
            }
            return target(<>p__, <>o__0.<>p__0.Target(<>o__0.<>p__0, foo, a, b));
        }
    }

и делайте так же.
Help will always be given at Hogwarts to those who ask for it.
Re[10]: Новости C#13. params
От: Baiker  
Дата: 03.09.24 01:53
Оценка: :))
Здравствуйте, 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, чем компилятор распухнет от "хардкоженных догадок" и потом люди будут долго медитировать над тем, почему очевидный код ведёт себя криво.
Простота — залог надёжности.
Re: Новости C#13. params
От: Shmj Ниоткуда  
Дата: 10.10.24 15:19
Оценка: :))
Здравствуйте, rameel, Вы писали:

R>В превью версию C#13 добавили для так называемой `params` collections поддержку IEnumerable<T> и ReadOnlySpan<T>. Значит скоро можно будет писать вот так

R>
R>void M(params IEnumerable<int> numbers);
R>void M(params ReadOnlySpan<int> numbers);
R>


R>https://x.com/jcouv/status/1767967748259545522


Ну добавили финтифлюшку и что от этого изменилось? Теперь быстрее программы писать будете?

Я к 40 годам начал смотреть на суть. Когда будет возможно сделать библиотеку на C#, которую можно будет использовать из любого ЯП на всех шести операционных системах/платформах, доступных человечеству?
Re[2]: Новости C#13. params
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 10.10.24 15:38
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Здравствуйте, rameel, Вы писали:


R>>В превью версию C#13 добавили для так называемой `params` collections поддержку IEnumerable<T> и ReadOnlySpan<T>. Значит скоро можно будет писать вот так

R>>
R>>void M(params IEnumerable<int> numbers);
R>>void M(params ReadOnlySpan<int> numbers);
R>>


R>>https://x.com/jcouv/status/1767967748259545522


S>Ну добавили финтифлюшку и что от этого изменилось? Теперь быстрее программы писать будете?


S>Я к 40 годам начал смотреть на суть. Когда будет возможно сделать библиотеку на C#, которую можно будет использовать из любого ЯП на всех шести операционных системах/платформах, доступных человечеству?


.Native AOT. Только зачем? В том же .Net в большинстве случаев отказываются от P/Invoke
Так или иначе в .Native AOT Il сначала транслируется в С++, затем с помощью С++ компиляторов генерится машинный код со сборщиком мусора.
и солнце б утром не вставало, когда бы не было меня
Re[3]: Новости C#13. params
От: Shmj Ниоткуда  
Дата: 10.10.24 15:45
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> .Native AOT.


iOS и Android: Официально не поддерживаются для Native AOT на данный момент. Для мобильных платформ используются другие технологии, такие как Xamarin/MAUI.

WebAssembly: Не поддерживается напрямую Native AOT. Для работы с WebAssembly используется Blazor и связанный с ним стек.


Т.е. не возможно для всех ОС — и ты хоть обвешай себя разными финтифлюшками — когда нет фундамента дома — бесполезно делать рюшечки на ставнях.

S> Только зачем?


Чтобы переиспользовать код — вынести код в библиотеку и использовать один и тот же код на всех платформах, коих у человечества ровно шесть штук:

1. Windows.
2. Linux.
3. MacOS.
4. Android.
5. iOS.
6. WASM.
Отредактировано 10.10.2024 15:46 Shmj . Предыдущая версия .
Re[4]: Новости C#13. params
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 10.10.24 15:50
Оценка:
Здравствуйте, 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.

Ииии? Нужно компилировать под каждую платформу отдельно.
Еще кстати есть Tizen OS https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/?tabs=windows%2Cnet8

Platform Supported architecture Notes
Windows x64, Arm64
Linux x64, Arm64
macOS x64, Arm64
iOS Arm64 Experimental support
iOSSimulator x64, Arm64 Experimental support
tvOS Arm64 Experimental support
tvOSSimulator x64, Arm64 Experimental support
MacCatalyst x64, Arm64 Experimental support
Android x64, Arm64 Experimental, no built-in Java interop
и солнце б утром не вставало, когда бы не было меня
Re[5]: Новости C#13. params
От: Shmj Ниоткуда  
Дата: 10.10.24 15:58
Оценка: :)
Здравствуйте, Serginio1, Вы писали:

S> Ииии? Нужно компилировать под каждую платформу отдельно.


Вы можете сделать приложение на .Net, чтобы именно из .Net использовать повторно C#-код.

Однако из того же Python или JS — уже не сможете библиотеку использовать, хотя это самый популярный ЯП.

Т.е. это вещь в себе — песочница для детей и экспериментов, отдаленная от реальной жизни.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.