2010-01-09 4 views
1

으로하는 ByRef 사용하여 나는 C#을 인터페이스로 이렇게 정의가 :인터페이스 방식의 구현 및 통과 VB.NET

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

가 나는 VB.NET 클래스에서이 인터페이스를 구현해야합니다. ByVal을 사용하여 전달 된 items 매개 변수를 사용하여 SetSecurityFlags 메서드를 구현하면 컴파일됩니다. 나는이 일을 알아낼 수 없습니다

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 

:

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

내가 항목 매개 변수를 구현하려고

는하는 ByRef, 나는 다음과 같은 컴파일러 오류가 발생하여 전달. VB.NET이 이것을 지원하지 않습니까? 아니면 제가 잘못하고 있습니까?

답변

4

이것은 VB 대 C# 문제가 아닙니다. 서명이 잘못되었다는 문제입니다.

인터페이스 메서드에는 by-value 매개 변수가 있지만 메서드에는 참조 매개 변수가 있으므로 메서드가 인터페이스를 구현하지 않습니다.

interface IFoo 
{ 
    void Bar(int x); 
} 

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

컴파일 오류 : 당신은 C#에서 그것을 할 경우이 같은 문제가 있습니다 당신이 ByRef 매개 변수를 사용할 필요가 있다고 생각 왜 설명하지 않은

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

를 - 그것은 가능성이 있습니다 List<T>과 같은 참조 유형에 대해서는 pass-by-value 의미론과 pass-by-value 의미를 실제로 이해하지 못합니다. 자세한 내용은 주제에 my article을보십시오.