2009-09-02 2 views
2

я должен делать что-то здесь не так (потому что на самом деле, каковы мои шансы расцепления над другими bug in the Vb.net compiler?)Странное поведения с родовыми ограничениями на методе расширения

У меня есть статическая обобщенная функция в .net 2.0 Vb код, я думал, что это было время, чтобы «обновить», чтобы быть метод расширения, но компилятор жалуется

метод расширения «AddIfUnqiue» имеет ограничения типа, которые никогда не могут быть удовлетворены .

Вот тривиальный пример, который показывает ту же проблему. Старая статическая версия (которая работает отлично), а затем с помощью метода расширения

Public Class MyStaticClass 
    Public Shared Sub AddIfUnqiue(Of T, L As {List(Of T)})(ByVal this As L, ByVal item As T) 
     If this.IndexOf(item) < 0 Then 
      this.Add(item) 
     End If 
    End Sub 
End Class 

Module UtilityExtensions 
    <Extension()> _ 
    Sub AddIfUnqiue(Of T, L As {List(Of T)})(ByVal this As L, ByVal item As T) 
    'ERROR: Extension method 'AddIfUnqiue' has type constraints that can never be satisfied' 
     If this.IndexOf(item) < 0 Then 
      this.Add(item) 
     End If 
    End Sub 
End Module 

эквивалентный код в C# не имеет никаких проблем, это просто вопрос Vb.

public static void AddIfUnique<T, L>(this L myList, T item) where L : List<T> 
{ 
    if (myList.IndexOf(item) < 0) 
     myList.Add(item); 
} 

Кто-нибудь знает, почему это не работает? Это может быть мои ограничения Vb (мне удобнее C#), но я не вижу, что я сделал неправильно.

Спасибо,

ответ

3

Это не ошибка, причина, почему он не компилируется объясняется here.

Поскольку метод является метод расширения , компилятор должен иметь возможность определить тип данных или типов, которые метод проходит только на основе первого параметра в методе декларации.

В вашем случае, вам просто нужно изменить свой код к этому:

<Extension()> _ 
Sub AddIfUnique(Of T)(ByVal this As List(Of T), ByVal item As T) 
    ... 
End Sub 
+0

Вы действительно мета-рыцарь в сияющих доспехах. Огромное спасибо :) –

0

Я бы сказал, что это ошибка.

Забавная вещь, тот же заголовок прекрасно работает не только в C# (как уже было сказано), но в VB, а также - если вы удалите расширения > атрибут <.

Так много о «методах расширения - это просто синтаксический сахар».

 Смежные вопросы

  • Нет связанных вопросов^_^