none
C# - не отрабатывается ключевое слово params RRS feed

  • Вопрос

  • Здравствуйте. Пишу сейчас com-библиотеку, которая вызывает внутри себя метод другой com-библиотеки (стороннего разработчика). Описание метода (из метаданных) следующее:

    dynamic getRecSet(ref string pProcName, params object[] p);

    Когда же я пытаюсь вызвать этот метод, перечисляя через запятую параметры, при проверке выдается ошибка:

    Ошибка 3 Аргумент "2": преобразование типа из <такой-то тип> в "ref object[]" невозможно.

    Если пытаюсь вызвать метод без параметров, выходит ошибка:

    Ошибка 1 Ни одна из перегрузок метода "getRecSet" не принимает "1" аргументов.

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

    19 ноября 2012 г. 6:03

Ответы

  • Неважно на чем написана COM библиотека. Все равно, она работает на неуправляемом коде. Даже если вы ее написали на C#. Вокруг нее добавляется обертка, которая эмулирует оболочку COM и передает вызовы в ваш код на .Net.

    В связи с тем, что params, это не более чем синтаксический сахар C#, то в COM он не поддерживается.

    • Помечено в качестве ответа Alex112524 19 ноября 2012 г. 10:43
    19 ноября 2012 г. 10:32
    Отвечающий

Все ответы

  • Приведите примеры вызова данной функции для обоих случаев.
    19 ноября 2012 г. 8:49
  • Коллега, вы немного путаете возможности .Net с возможностями неуправляемого кода.

    В .Net у вас params будет отрабатывать как положено, а вот в мире COM, у вас этот параметр рассматривается только как массив.

    19 ноября 2012 г. 8:57
    Отвечающий
  • tulosba:

    Пример с попыткой передачи параметров:

    public string GetIncomeStatus(int id) // id - параметр метода
    {
    string procName = "COM_EXPORT.GetIncomeNoteStatusByID";
      // Так ругается на ошибку преобразования типа (adal - это COM-объект, метод которого я вызываю): 
      // object rs = adal.getRecSet(ref procName, parameters);
    // Поэтому делаю так:
    object[] parameters = new object[1] { id };
    object rs = adal.getRecSet(ref procName, parameters);

    Алексей Лосев:

    то есть, если com-библиотека разрабатывалась не под .Net (она на самом деле довольно древняя), то и наличие params в описании метода, никакой роли при разработке на C# играть не будет?

    19 ноября 2012 г. 10:22
  • Неважно на чем написана COM библиотека. Все равно, она работает на неуправляемом коде. Даже если вы ее написали на C#. Вокруг нее добавляется обертка, которая эмулирует оболочку COM и передает вызовы в ваш код на .Net.

    В связи с тем, что params, это не более чем синтаксический сахар C#, то в COM он не поддерживается.

    • Помечено в качестве ответа Alex112524 19 ноября 2012 г. 10:43
    19 ноября 2012 г. 10:32
    Отвечающий
  • Спасибо за разъяснение.
    19 ноября 2012 г. 10:43