2010-01-09 7 views
1

j'ai une interface C# définie comme ceci:La méthode d'interface mise en œuvre et le passage à l'aide ByRef avec VB.NET

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

J'ai besoin de mettre en œuvre cette interface dans une classe VB.NET. Lorsque j'implémente la méthode SetSecurityFlags avec le paramètre items passé en utilisant ByVal, il compile.

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

Lorsque je tente de le mettre en œuvre avec le paramètre éléments transmis à l'aide ByRef, je reçois l'erreur du compilateur suivant:

Class 'UserRights' must implement 'Sub SetSecurityFlags(items As System.Collections.Generic.List(Of Model.MenuItem))' for interface

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

Je ne peux pas sembler comprendre cela. Est-ce que VB.NET ne supporte pas cela ou est-ce que je fais quelque chose de mal?

Répondre

4

Ceci n'est pas un problème VB vs C# - c'est un problème de signature erronée.

Votre méthode n'implémente pas l'interface, car la méthode d'interface a un paramètre de valeur, alors que votre méthode a un paramètre de référence. Vous aurez le même problème si vous le faites en C#:

interface IFoo 
{ 
    void Bar(int x); 
} 

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

erreur de compilation:

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

Vous avez pas expliqué pourquoi vous pensez que vous devez utiliser un paramètre ByRef - il est possible que vous ne comprenez pas vraiment la sémantique pass-by-reference vs pass-by-value quand il s'agit de types de référence comme List<T>. Jetez un oeil à my article sur le sujet pour plus d'informations.

Questions connexes