Новости 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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.