Здравствуйте, _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"));
}
}