Здравствуйте, Воронков Василий, Вы писали:
ВВ>Не понял. Давай с примерами кода. Мне в метод Foo(params) передали несколько параметров вида Foo(x, y, z). Я хочу эти параметры передать в метод Bar(params). Что я буду делать?
как будет <=> как было
Bar(params args) <=> Bar(x, y, z); Bar(args)
Bar(args) <=> Bar( (object)args )
ВВ>int[] arr = new int[0, 1, 2];
ВВ>foo(arr);//Что ожидаете в этом случае?
Банально же, ps[0] = ссылка на массив трёх целых.
ВВ>int[] arr = null;
ВВ>foo(arr);//А в этом случае?
ВВ>
Здравствуйте, _FRED_, Вы писали:
_FR>Open you mind — вспомните, что для платформы .NET существует множество языков, ни один из которых не обязан поддерживать params.
Я бы посоветовал ровно это же в ответ: Если отбросить маркетоидную шелуху, для платформы .НЕТ существует ОДИН ПОЛНОЦЕННЫЙ ЯЗЫК — C#.
ВВ>В твоем варианте я так не смогу. Т.е. хуже уже стало, а вот бенефиты сомнительны.
Для подобных случаев прекрасно сработает костыль: если params сущность передаётся в другую функцию в аргументе params, она незаметно развёртывается. Что тут сложного?
Я больше скажу: ДАЖЕ если бы это не было возможно, архитектурная стройность языка превыше микросекундных выйгрышей. Увы, но с текущим поведением C# напоминает студенческую лабораторку, где за 10 минут до сдачи "улучшили" скорость. "И эти люди учат меня не ковыряться в носу!" (ц)
Здравствуйте, matumba, Вы писали:
M>Здравствуйте, _FRED_, Вы писали:
_FR>>Open you mind — вспомните, что для платформы .NET существует множество языков, ни один из которых не обязан поддерживать params.
M>Я бы посоветовал ровно это же в ответ: Если отбросить маркетоидную шелуху, для платформы .НЕТ существует ОДИН ПОЛНОЦЕННЫЙ ЯЗЫК — C#.
Один из неполноценных языков (хнык ), кстати, ведёт себя так же как C#:
type Foo =
static member Bar([<System.ParamArray>] ps : obj array) =
printfn "got %d parameters for great good" ps.Length
Foo.Bar(null, null, null, null)
Foo.Bar(null, null, null)
Foo.Bar(null, null)
Foo.Bar(null) (* аналогично *)
Foo.Bar()
Это ещё что... Об этом везде написано. Я другой пример покажу:
using System;
using System.Collections.Generic;
class Problem
{
static void Main()
{
var x = new[] { new List<string>(), new List<string>() };
Bar1(x);
Bar2(x);
}
static void Bar1<T>(T[] x) where T : IList<string>
{
Foo(x);
}
static void Bar2<T>(T[] x) where T : List<string>
{
Foo(x);
}
static void Foo(params object[] x)
{
Console.WriteLine(x.Length);
}
}
Здравствуйте, nikov, Вы писали:
N>Я другой пример покажу:
Владимир, а не могли бы Вы разъяснить логику компилятора в данном случае? У меня взорвало мозг...
У F# в данной ситуации всё ок:
open System
open System.Collections.Generic
type Problem =
static member Bar1(x: #IList<string>[]) = Problem.Foo(x)
static member Bar2(x: #List<string>[]) = Problem.Foo(x)
static member Foo([<ParamArray>] x: obj[]) = printfn "%d" x.Length
let xs : List<string>[] = [| |]
Problem.Bar1(xs) // 1
Problem.Bar2(xs) // 1