Лучший отвечающий
C# - не отрабатывается ключевое слово params

Вопрос
-
Здравствуйте. Пишу сейчас 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