В превью версию 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> Но геморроя добавляется.