Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 一种推广方法上具有一般约束的奇性_Vb.net_Generics_Constraints - Fatal编程技术网

Vb.net 一种推广方法上具有一般约束的奇性

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

我一定是做错了什么(因为真的,我被别人绊倒的可能性有多大?)

我在.NET2.0VB代码中有一个静态泛型函数,我认为是时候将它“升级”为一个扩展方法了,但编译器抱怨

扩展方法“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
公共类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是如何做到的?对于扩展方法,它有不同的语法,但它不具有相同的类型推断要求吗?