Реализация метода интерфейса и передача с использованием ByRef с VB.NET - PullRequest
1 голос
/ 09 января 2010

У меня есть интерфейс C #, определенный так:

public interface IMenuSecurityService
{
    void SetSecurityFlags(List<MenuItem> items);
}

Мне нужно реализовать этот интерфейс в классе VB.NET. Когда я реализую метод SetSecurityFlags с параметром items, переданным с помощью ByVal, он компилируется.

Public Sub SetSecurityFlags(ByVal items As List(Of L1.Common.Model.MenuItem)) Implements IMenuSecurityService.SetSecurityFlags
    ' Do some work
End Sub

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

Класс «UserRights» должен реализовывать «Sub SetSecurityFlags (элементы как System.Collections.Generic.List (Of Model.MenuItem))» для интерфейса

Public Sub SetSecurityFlags(ByRef items As List(Of L1.Common.Model.MenuItem)) Implements IMenuSecurityService.SetSecurityFlags
    ' Do some work
End Sub

Я не могу понять это. VB.NET не поддерживает это или я делаю что-то не так?

1 Ответ

4 голосов
/ 09 января 2010

Это не проблема VB против C # - это проблема вашей подписи, которая неверна.

Ваш метод не реализует интерфейс, потому что метод интерфейса имеет параметр по значению, тогда как ваш метод имеет параметр по ссылке. У вас будет такая же проблема, если вы сделаете это в C #:

interface IFoo
{
    void Bar(int x);
}

class Foo : IFoo
{
    public void Bar(ref int x) {}
}

Ошибка компиляции:

Test.cs(8,7): error CS0535: 'Foo' does not implement interface member
    'IFoo.Bar(int)'

Вы не объяснили, почему вы считаете необходимым использовать параметр ByRef - возможно, вы действительно не понимаете передачу по ссылке против семантики передачи по значению, когда речь идет о ссылочных типах, таких как List<T>. Посмотрите мою статью на эту тему для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...