Подпись метода COM-взаимодействия с ByRef

У меня есть программа на C#, которая вызывает COM DLL, которая имеет метод с именем test с двумя параметрами: передается первый параметр ByValвторой пройден ByRef,

Вот что делает COM DLL:

Public Sub test(ByVal a As String, ByRef b As String)
    a = "a"
    b = "b"
End Sub

Вот что делает программа C#:

test.Class1 x = new test.Class1();
            string a = "1";
            string b = "2";
            x.test(a, ref b);

Я замечаю, что если я удалю ref Ключевое слово, компилятор не советует мне, что я пропустил ref Ключевое слово и передает параметр ByVal, Это может быть большой проблемой, если я скучаю по ref Ключевое слово, потому что я не могу заметить это, пока я не знаю, что он хочет ref, Знаете ли вы, почему компилятор демонстрирует такое поведение?

1 ответ

Решение

Это очень специфично для кода взаимодействия COM и языка C# версии 4 и выше. Да, это позволяет опускать ref в этом конкретном случае. В C# версии 4 было много настроек, облегчающих программирование Office. API-интерфейсы Office изначально предназначались для работы с ранними версиями VB, по умолчанию они использовали ByRef. Тем не менее дело для VBA. Таким образом, API имеет много параметров метода, которые являются ByRef, даже если они на самом деле не изменяют переданный аргумент.

Компилятор сгенерирует временную переменную, если необходимо сделать вызов легальным. В результате ваша переменная не обновляется. Что-то, за чем вы должны следить. Два шага вперед, один шаг назад:)

Другие вопросы по тегам