C # и VB.Net выходные параметры - PullRequest
7 голосов
/ 08 августа 2011

У меня есть проект на c #, который использует другой проект, написанный на vb.net.В настоящее время я могу изменить оба.

У меня есть метод в проекте VB, такой как:

    Public Sub MethodName(ByVal param1 As String, ByRef param2 As String)
        param2 = param1 + 1
    End Sub

Я не могу вызвать этот метод, используя ключевое слово out из C #:

    public void CallOtherMethod()
    {
        string param1 ="test";
        string param2;

        provider.AddTransaction(param1, out param2);
    }

Разве ключевое слово ByRef в VB.Net не должно иметь возможности "ref" и "out"?

Должен ли я просто перейти с ref?

Ответы [ 4 ]

14 голосов
/ 08 августа 2011

Для времени выполнения ref и out довольно взаимозаменяемы, так как оба просто передают ссылку. Однако , out имеет префикс с дополнительным атрибутом в IL:

public void y(ref int a)
public void z(out int a)

превращается в

.method public hidebysig instance void  y(int32& a)
.method public hidebysig instance void  z([out] int32& a)

, что позволяет компилятору C # различать два и добавляют особую семантику, которая есть у out, а именно, что параметру out не нужно иметь назначенное значение перед входом в метод, а должно быть присвоено значение перед выходомметод.

Напротив, ByRef в VB предоставляет только ref, но не дополнительную семантику out.Там нет эквивалента out в VB.

4 голосов
/ 13 августа 2011

Как упоминалось в моем вопросе и ответе , вы можете указать <Out()> attibute в определении параметра и, хотя VB игнорирует его, C # обрабатывает аргумент правильно.

2 голосов
/ 08 августа 2011

Перейти с ref - это эквивалент C # для VB's ByRef.

НО Прочитать это подробное объяснение: Когда использовать ref vs out .

2 голосов
/ 08 августа 2011

Нет эквивалента out в VB (насколько мне известно). Просто ByRef, что эквивалентно ref, так что это будет правильный выбор.

Поскольку вы будете передавать по ссылке, вызываемая функция получит ваше значение, и вам нужно будет инициализировать ваш параметр так, чтобы он имел адрес в памяти.

EDIT:

Так как вы можете редактировать оба, почему бы не изменить Sub на Function и избавиться проблемы в целом и, IMO, сделайте ваш код лучше.

...