Vb.net 一种推广方法上具有一般约束的奇性
我一定是做错了什么(因为真的,我被别人绊倒的可能性有多大?) 我在.NET2.0VB代码中有一个静态泛型函数,我认为是时候将它“升级”为一个扩展方法了,但编译器抱怨 扩展方法“AddIfUnqiue”已 类型约束,这些约束永远不能被删除 满意 下面是一个显示相同问题的简单示例。旧的静态版本(工作正常)后面跟着扩展方法Vb.net 一种推广方法上具有一般约束的奇性,vb.net,generics,constraints,Vb.net,Generics,Constraints,我一定是做错了什么(因为真的,我被别人绊倒的可能性有多大?) 我在.NET2.0VB代码中有一个静态泛型函数,我认为是时候将它“升级”为一个扩展方法了,但编译器抱怨 扩展方法“AddIfUnqiue”已 类型约束,这些约束永远不能被删除 满意 下面是一个显示相同问题的简单示例。旧的静态版本(工作正常)后面跟着扩展方法 Public Class MyStaticClass Public Shared Sub AddIfUnqiue(Of T, L As {List(Of T)})(ByVa
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
公共类MyStaticClass
公共共享子AddIfUnqiue(Of T,L为{List(Of T)})(ByVal this为L,ByVal item为T)
如果此.IndexOf(项)<0,则
此。添加(项目)
如果结束
端接头
末级
模块实用性扩展
_
子附加项(T的,L为{列表(T的)})(将此项作为L,将项作为T)
'错误:扩展方法'AddIfUnqiue'具有永远无法满足的类型约束'
如果此.IndexOf(项)<0,则
此。添加(项目)
如果结束
端接头
端模块
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);
}
publicstaticvoidaddifunique(这个L myList,T项),其中L:List
{
if(myList.IndexOf(项目)<0)
myList.Add(项目);
}
有人知道为什么这样不行吗?
这很可能是我的Vb限制(我更喜欢c),但我看不出我做错了什么
谢谢,这不是一个bug,解释了它无法编译的原因 因为该方法是一个扩展 方法,编译器必须能够 确定要使用的数据类型 该方法仅基于 方法中的第一个参数 声明 在您的情况下,只需将代码更改为:
<Extension()> _
Sub AddIfUnique(Of T)(ByVal this As List(Of T), ByVal item As T)
...
End Sub
_
子附件(共T项)(以该项为列表(共T项),以该项为列表(共T项)
...
端接头
我认为这是一个bug
有趣的是,同样的标题不仅在C#(正如您已经说过的)中可以正常工作,而且在VB中也可以正常工作——如果您删除该属性
“扩展方法仅仅是语法上的糖分。”你确实是一个穿着闪亮盔甲的元骑士。非常感谢:)C是如何做到的?对于扩展方法,它有不同的语法,但它不具有相同的类型推断要求吗?