我正在使用现在VB.NET中的旧VB 6.0代码。所以它使用了一些过时的集合类型。我试图在不破坏内容的情况下尽可能地升级这些内容。
假设我有一系列Books HashSet(Of Book),我有一系列Premium Books HashSet(Of PremiumBook)。
PremiumBook源自Book。唯一的区别是我重写了EQUALS和HASHCODE方法。其他一切都是一样的。
由于PremiumBook是我能做的书:
Dim anyBook as Book
Dim goldBook as PremiumBook = New PremiumBook()
anyBook = goldBook
那为什么我不能
DirectCast(HashSet(Of PremiumBook), HashSet(Of Book)
)
我得到的错误是: " System.Collections.Generic.HashSet类型的值(Of SameNamespace.Different.frmBookManager.PremiumBook)'无法转换为' System.Collections.Generic.HashSet(Of SameNamespace.Something.Book)'。
是因为命名空间不同吗?这对我没有任何意义。
我觉得好像我有一个对象集合,任何派生类型都应该能够适合该集合。
谢谢!
答案 0 :(得分:1)
即使它们是继承的,也不能转换两个不同的对象类型集合,但是您可以将各个成员转换为继承的类。例如:
Option Strict On
Option Explicit On
Module Module1
Sub Main()
Dim Booklist As List(Of Book) = New List(Of Book)
Booklist.Add(New PremiumBook())
Booklist.Add(New PremiumBook())
Booklist.Add(New PremiumBook())
Booklist.Add(New Book())
For Each bk As Book In Booklist
If bk.GetType() Is GetType(PremiumBook) Then 'If your collection contains multiple types, if not this check can be omitted
Dim premiumBk As PremiumBook = DirectCast(bk, PremiumBook)
End If
Next
Dim premiumBk2 As PremiumBook = DirectCast(Booklist(2), PremiumBook)
End Sub
End Module