我在这里严格要求语言转换:
List<?>
我已经有了解决方法我很惊讶我找不到vb.net相当于一个带有外卡的“原始”通用列表的变量类型。 Java的机制使您可以引用列表而不管T是什么。 Java甚至可以让您更进一步,例如:
List<? extends Number>
List<? super Double>
我试过了:
List(Of )
这不起作用。这似乎只适用于GetType函数。
答案 0 :(得分:4)
那些不是C#泛型声明,它们是Java声明,因此在VB.NET中没有等效声明。
正如Konrad在上面的评论中所述,Java和C#具有完全不同的通用实现。 C#通过扩展工作,Java通过擦除工作。因此在C#中没有“原始”泛型类型可用。
答案 1 :(得分:3)
你在谈论
List(of T)
List(of String)
等
答案 2 :(得分:1)
请参阅MSDN上的Generic Types in Visual Basic (Visual Basic)。您正在寻找的是一种类型约束。您必须将其与对执行所需限制的方法或类的声明相结合。
接受您可以执行的任何类型:
Public Sub testSub(Of t)(arg As List(Of t))
'Do something.
End Sub
或者,例如,要将其限制为值类型,您可以执行以下操作:
Public Sub testSub(Of t As Structure)(arg As List(Of t))
'Do something.
End Sub
您正在寻找的是纯粹的通用属性,在.Net Framework中是不允许的。下面的代码不会编译。
Public Property testSub(Of t) As List(Of t)
Get
End Get
Set
End Set
End Property
最接近的是:
Public Class testClass(Of T)
Public Property testSub As List(Of t)
Get
End Get
Set
End Set
End Property
End Class
答案 3 :(得分:0)
好的我的目标是能够在MyBaseClass上有一个Collection属性,指向它的集合,它的类型为MyCollection(Of T),其中T是MyBaseClass的一种类型。基类不知道将它子类化的内容。因此,它需要分配MyCollection的任何实现并获得早期绑定和智能感知。
我需要吃蛋糕并吃它(早期结合和晚期结合)。
这是我在MyBaseClass中所做的:
Public Event pCollectionChanged(Value As IList)
Private _pCollection As IList
<XmlIgnore()> _
<System.ComponentModel.Browsable(False)> _
Public Property pCollection As IList
Get
Return _pCollection
End Get
Set(Value As IList)
If _pCollection Is Value Then Exit Property
_pCollection = Value
RaiseEvent pCollectionChanged(Value)
End Set
End Property
Public Function Collection(Of t As MyBaseClass)() As MyCollection(Of t)
Return pCollection
End Function
现在我可以将一个MyCollection(任何东西)分配给pCollection,我可以通过调用代码来完成:
Dim MyObject As New MyBaseClassSubType
MyObject.Collection(Of MyBaseClassSubType).MyNeatoCollectionMethod
然而在我刚收到集合作为IList之前,它没有让我访问MyNeatoCollectionMethod
多田!感谢所有回答的人。