我在这里严格寻找语言转换:
List<?>
我已经有一个解决方法我只是很惊讶我找不到与带有通配符的“原始”通用列表的变量类型的 vb.net 等效项。这里的 Java 机制使您能够引用列表,而不管 T 是什么。Java 甚至可以让您走得更远并执行以下操作:
List<? extends Number>
List<? super Double>
我试过了:
List(Of )
那没有用。这似乎只适用于 GetType 函数。
这些不是 C# 泛型声明,它们是 Java 声明,因此在 VB.NET 中没有等价物。
正如 Konrad 在上面的评论中所说,Java 和 C# 具有完全不同的通用实现。C# 通过扩展工作,Java 通过擦除工作。因此在 C# 中没有可用的“原始”泛型类型。
你在谈论
List(of T)
List(of String)
等等
请参阅MSDN 上的 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
好的,我的目标是能够在 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(Of any) 分配给 pCollection,我可以通过调用代码来做到这一点:
Dim MyObject As New MyBaseClassSubType
MyObject.Collection(Of MyBaseClassSubType).MyNeatoCollectionMethod
而在我刚刚拥有 Collection As IList 之前,我无法访问 MyNeatoCollectionMethod
多田!感谢所有回答的人。