我必须在这里做错事(因为真的,我绊倒另一个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#感觉更舒服),但我看不出我做错了什么。
谢谢,
答案 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;属性。
关于“扩展方法仅仅是语法糖”。