Здравствуйте, VladD2, Вы писали:
VD>Наличие функций с более чем одним параметром возможно благодаря кортежам. Если функция принимает два параметра один из которых строка, а второй целое, то такая функция записывается как "string * int -> Y". Таким образом типом параметров такой функции является кортеж "string * int". Логично, что и возвращаемое значение может быть так же кортежем, например, "string * int -> string * int".
VD>В чем же проблема? Проблема в том, что простые смертные оперируют конкретикой. Для них мало абстрактных типов аргументов и возвращаемого значения. Им нужны еще названия параметров.
Проблема не только в этом. А так же в том, что запись string*int->Y не совсем соответствует действительности для платформы .NET. В немерле так принято записывать только потому что string->int->Y еще больше не соответсвует действительности.
Допустим, что мы имеем функцию string * int -> string * int, которая принимает "якобы" кортеж (а на самом деле два аргумента через запятую), а возвращает именно кортеж. Проблема в том, что чтобы подать результат функции на ее же вход, потребуется кортеж разделить на части и подать их по-частям. Очевидно, что мы не можем записывать одинаково то что физически является разными вещами (вход и выход).
Т.е. если мы оставляем запись string*int для обозначения кортежа, то функция типа string*int->string*int должна как принимать именно кортеж, так и возвращать его.
Кроме того, мы должны уметь передавать кортежи в функцию, и передача (string, string * int) не должна автоматически преобразоваться в (string * string * int).
VD>Теперь, собственно предложение.
VD>Расширение C#:
VD>VD>(string ret1, int ret2) FuncName(string param1, int param2)
VD>{
VD>}
VD>(string ret1) FuncName(int param2)
VD>{
VD>}
VD>
Я уже где-то недавно в шутку предлагал (возможно в той теме) вариант с возвратом из метода анонимного типа.
Что-то воде
{string ret1, int ret2} FuncName(string param1, int param2)
{
}
Т.е. хочется скрестить ужа с ежом и получить анонимный тип с позиционным доступом или тупл с именованными свойствами, причем с полной совместимостью по типу, невзирая на имена свойств.
И разрешить не только возвращать такие штуки, но и принимать их и объявлять в теле метода.
{ r1, r2 } = Func(p1, p2);
и
{ string ret1, int ret2 } FuncName(string param1, { string p1, int p2 })
Причем, результат совместим с типом второго аргумента функции.