2009-09-02 7 views
2

je dois faire quelque chose de mal ici (parce que vraiment, quelles sont les chances de me trébuche sur une autre bug in the Vb.net compiler?)comportement étrange avec contraintes génériques sur une méthode d'extension

J'ai une fonction générique statique dans .net 2.0 Vb code, je pensais qu'il était temps de « mettre à jour » pour être une méthode d'extension, mais le compilateur se plaint avec

méthode d'extension « AddIfUnqiue » a des contraintes de type qui ne peut jamais être satisfait .

Voici un exemple trivial qui affiche le même problème. L'ancienne version statique (qui fonctionne très bien), suivie par la méthode d'extension

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 

Le code équivalent en C# n'a pas de problème, il est juste une question Vb.

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

Quelqu'un at-il une idée de pourquoi cela ne fonctionne pas? Il pourrait bien s'agir de mes contraintes Vb (je suis plus à l'aise avec C#), mais je ne vois pas ce que j'ai fait de mal.

Merci,

Répondre

3

Il n'y a pas un bug, la raison pour laquelle il ne compile pas est expliqué here.

Parce que la méthode est une extension méthode , le compilateur doit être en mesure de déterminer le type de données ou types qui la méthode étend basée uniquement sur le premier paramètre dans la méthode déclaration .

Dans votre cas, il vous suffit de changer votre code à ceci:

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

Vous êtes en effet un Méta-Chevalier en armure étincelante. Merci beaucoup :) –

0

Je dirais que c'est un bug.

chose drôle, le même en-tête fonctionne très bien non seulement en C# (comme vous avez déjà dit), mais en VB et - si vous supprimez l'extension < > attribut. Beaucoup de choses sur les "méthodes d'extension ne sont que du sucre syntaxique."