2011-10-26 2 views
1

コンパイラは、これらのシグネチャは互換性がないと言っていますが、私にとってはうまく見えます。何か不足していますか? [VS 2008]なぜこの関数はこの代理人と非互換署名を持っていますか?

Public MustOverride Function OverridePickUpLocationFromDeliveryAddress(ByVal objDeliveryAddress As DeliveryLocationWS.DeliveryAddress, _ 
                     ByRef lstProcessingMessages As List(Of String), _ 
                     ByVal objProcessorHelperLists As ProcessorHelperLists) As Integer 

Public Sub New()  
    Dim fncTest As Func(Of DeliveryLocationWS.DeliveryAddress, List(Of String), ProcessorHelperLists, Integer) = AddressOf OverridePickUpLocationFromDeliveryAddress 
End Sub 
+0

これらのカスタムタイプを汎用オブジェクトタイプに変更すると、同じエラーが発生します。関数Foo(オブジェクト、リスト(文字列)、オブジェクト、整数)のFuncとして= Foo – N0Alias

答えて

3

はあなたの関数はFunc(Of T1, T2, T3, T4)あなたがそれを割り当てるしようとしているに受け入れられている、参照(lstProcessingMessages)でのparamaterをとります。

私が知る限り、Func代理人は "by ref"を型引数としてサポートしていません。

static void Main() 
{ 
    Func<int, int> myDoItFunc1 = DoIt; // Doesn't work because of ref param 
    Func<int, int> myDoItFunc2 = DoItFunc; // Does work 
} 

public static int DoItFunc(int i) 
{ 
    return DoIt(ref i); 
} 

public static int DoIt(ref int i) 
{ 
    return 0; 
} 

しかし、どうしてあなたはlstProcessingMessagesを引用していますか?これは参照型です。あなたはリストの参照を完全に置き換えることを期待しているのですか、代わりにクリアして代入することができますか?

static void Main() 
{ 
    var myList = new List<int>(); 

    AddToMyList(myList); 

    // myList now contains 3 integers. 

    ReplaceList(myList); 

    // myList STILL contains 3 integers. 

    ReplaceList(ref myList); 

    // myList is now an entirely new list. 
} 

public static void AddToMyList(List<int> myList) 
{ 
    myList.Add(1); // Works because you're calling "add" 
    myList.Add(2); // on the *same instance* of my list 
    myList.Add(3); // (object is a reference type, and List extends object) 
} 

public static void ReplaceList(List<int> myList) 
{ 
    myList = new List<int>(); 
} 

public static void ReplaceList(ref List<int> myList) 
{ 
    myList = new List<int>(); 
} 
+0

リストの(オブジェクトのByval objXオブジェクトとして、ByRef lstXとしてList(Stringの)、Byval objYオブジェクトとして)文字列は私が追加しようと考えたリストでしたが、整数とリスト(Stringの両方)を持つカスタムオブジェクトを返さなければなりません。 – N0Alias

+2

いいえ、あなたはしません。単にByValのリストを渡し、項目を追加します。 –

+1

'OverridePickUpLocationFromDeliveryAddress'メソッドが新しいリストを作成しなければならない場合は、' ByRef'パラメータを宣言する必要があります。しかし、新しいリストを作成し、それを 'ByVal'に渡し、メソッド内にそれを設定するほうが簡単かもしれません。 –

0

FuncパラメータはByValとして宣言されているように、動作しません。ただし、独自のデリゲートタイプを宣言することもできます。

Delegate Function PickUpLocationDelegate(ByVal objDeliveryAddress As DeliveryLocationWS.DeliveryAddress, _ 
    ByRef lstProcessingMessages As List(Of String), _ 
    ByVal objProcessorHelperLists As ProcessorHelperLists) As Integer 

Public Sub New() 
    Dim fncTest As PickUpLocationDelegate = AddressOf OverridePickUpLocationFromDeliveryAddress 
End Sub 
関連する問題