DirectCast One派生到基本Collection中

时间:2016-03-15 20:19:49

标签: vb.net collections

我正在使用现在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)'。

是因为命名空间不同吗?这对我没有任何意义。

我觉得好像我有一个对象集合,任何派生类型都应该能够适合该集合。

谢谢!

1 个答案:

答案 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