Arhn - архитектура программирования

Возможны ли несколько параметров params?

Возможно ли иметь несколько параметров params в С#? Что-то вроде этого:

void foobar(params int[] foo, params string[] bar)

Но я не уверен, что это возможно. Если да, то как компилятор решит, где разделить аргументы?

07.08.2012

  • Добро пожаловать в Переполнение стека Гэри, 5 ответов перечислены почти за столько же секунд. Почему вы не передаете параметр классов? или <IEnum<IEnum>> 07.08.2012
  • Что вы подразумеваете под передачей параметра классов? 08.08.2012
  • Я был поражен отсутствием этой функции :( 29.05.2013

Ответы:


1

У вас может быть только один аргумент params. У вас может быть два аргумента массива, и вызывающая сторона может использовать инициализаторы массива для вызова вашего метода, но может быть только один аргумент params.

void foobar(int[] foo, string[] bar)

...

foobar(new[] { 1, 2, 3 }, new[] { "a", "b", "c" });
07.08.2012
  • Спасибо, именно тот ответ, который я искал :) 08.08.2012
  • Голосование за ваш 10-й голос (предоставление вам значка) только потому, что ОП не принял ваш ответ. :) 15.02.2014

  • 2

    Нет, это невозможно. Возьми это:

    void Mult(params int[] arg1, params long[] arg2)
    

    как компилятор должен интерпретировать это:

    Mult(1, 2, 3);
    

    Это может быть прочитано как любое из этих:

    Mult(new int[] {         }, new long[] { 1, 2, 3 });
    Mult(new int[] { 1       }, new long[] {    2, 3 });
    Mult(new int[] { 1, 2    }, new long[] {       3 });
    Mult(new int[] { 1, 2, 3 }, new long[] {         });
    

    Однако вы можете взять два массива в качестве параметров, например:

    void Mult(int[] arg1, params long[] arg2)
    
    07.08.2012
  • @newfal Правильно, но я не ошибаюсь, поэтому меня смущает отрицательный голос. 29.05.2013
  • потому что вы указываете это как причину отсутствия этой функции. 29.05.2013
  • если типы групп параметров отличаются друг от друга, компилятор может интерпретировать... например, скажем, method(params int[] numbers, params string[] texts){} . method(34,76, привет, как дела!); 15.06.2017
  • Mult(1, 2, (long)3, 5, 6); после 3 это могут быть длинные параметры, 25.10.2018
  • Я бы не стал поддерживать что-то подобное, потому что неявное приведение типов уже есть в С# и может все испортить. Но поддержка нескольких параметров и просто добавление предупреждения о неоднозначности, как с перегрузками и необязательными параметрами, не составит труда. 12.03.2019

  • 3

    Я знаю, что это супер старый пост, но вот:

    В C# 7 это действительно возможно. Вы можете использовать System.ValueTuple для этого:

    private void Foorbar(params (int Foo, string Bar)[] foobars)
    {
        foreach (var foobar in foobars)
            Console.WriteLine($"foo: {foobar.Foo}, bar: {foobar.Bar}");   
    }
    

    И тогда вы можете использовать его следующим образом:

    private void Main() => Foobar((3, "oo"), (6, "bar"), (7, baz));
    

    И очевидный вывод:

    Foo: 3, Bar: foo
    Foo: 6, Bar: bar
    Foo: 7, Bar: baz
    

    Единственным недостатком является то, что вы должны сделать это: foobars[0].foo; вместо foos[0];, но это действительно крошечная проблема. Кроме того, если вы действительно хотите, вы можете сделать какое-то расширение или функцию для преобразования их в массивы, хотя я не думаю, что это того стоит.

    17.05.2018
  • @anatol Я думаю, это стоит отметить, но никто не упомянул атрибуты. 01.08.2020

  • 4

    Из MSDN — параметры

    Никакие дополнительные параметры не допускаются после ключевого слова params в объявлении метода, и разрешено только одно ключевое слово params в объявлении метода.

    07.08.2012

    5

    Нет, разрешен только один параметр, и даже он должен быть последним аргументом. Прочтите это

    Это будет работать

    public void Correct(int i, params string[] parg) { ... }
    

    Но это не сработает

    public void Correct(params string[] parg, int i) { ... }
    
    07.08.2012

    6

    Это невозможно. Это может быть только одно ключевое слово params для каждого объявления метода - из MSDN - http://msdn.microsoft.com/en-us/library/w5zay9db(v=vs.71).aspx

    07.08.2012

    7
  • Вы не использовали ключевое слово params, как было задано в вопросе. 07.08.2012
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..