Почему эта функция имеет несовместимую подпись с этим делегатом? - PullRequest
1 голос
/ 27 октября 2011

Компилятор говорит мне, что эти подписи несовместимы, но они кажутся мне подходящими. Я что-то пропустил? [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

Ответы [ 2 ]

3 голосов
/ 27 октября 2011

Ваша функция принимает параметр по ссылке (lstProcessingMessages), что недопустимо для Func(Of T1, T2, T3, T4), которому вы пытаетесь присвоить его.

Насколько я знаю, делегат Func не поддерживает "по ссылке" в качестве аргумента типа.

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 голосов
/ 01 февраля 2012

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...