在Extension方法上使用泛型约束的奇怪行为

时间:2009-09-02 15:48:51

标签: vb.net generics constraints

我必须在这里做错事(因为真的,我绊倒另一个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#感觉更舒服),但我看不出我做错了什么。

谢谢,

2 个答案:

答案 0 :(得分:3)

这不是一个错误,它不编译的原因解释为here

  

因为该方法是扩展名   方法,编译器必须能够   确定数据类型   该方法仅基于   方法中的第一个参数   声明。

在您的情况下,您只需将代码更改为:

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

答案 1 :(得分:0)

我说这是一个错误。

有趣的是,相同的标题不仅可以在C#中正常工作(如您所说),但在VB中也是如此 - 如果,则删除&lt; Extension&gt;属性。

关于“扩展方法仅仅是语法糖”。