无法将类型 'VB$StateMachine_4_GetAllFrontPageBanners' 的对象转换为类型 IEnumerable(FrontPageBanner)

Unable to cast object of type 'VB$StateMachine_4_GetAllFrontPageBanners' to type IEnumerable(Of FrontPageBanner)

我不太习惯使用 VB.NET,但我遇到了谷歌搜索无法解决问题的错误。我创建了这个数据访问 class,它有一个使用 Yield 和 vb.net 的对象初始化快捷方式

的方法
Public Class FMACMarketingRepository
    Private cvConnection As SqlConnection
    Private cvCommand As SqlCommand
    Private cvReader As SqlDataReader

    Public Sub New(Role As InfotelLibrary.Data.DatabaseRole)
        cvConnection = New SqlConnection(InfotelLibrary.Data.ConnectionString(Role, InfotelLibrary.Data.DatabaseName.Mongoose))
    End Sub

    Public Iterator Function GetAllFrontPageBanners() As IEnumerable(Of FrontPageBanner)
        Using dbConnection As IDbConnection = cvConnection
            Using cmd As IDbCommand = dbConnection.CreateCommand()
                cmd.CommandType = CommandType.StoredProcedure
                cmd.CommandText = "sel_AllFmacFrontPageBanners"
                Using reader As IDataReader = cmd.ExecuteReader()
                    If reader Is Nothing Then
                        Yield Nothing
                    End If
                    While reader.Read()
                        Yield New FrontPageBanner() With
                        {
                            .Banner_Id = CType(reader("Banner_ID"), Integer),
                            .Geo_Id = CType(reader("Geo_ID"), Long),
                            .Title = CType(reader("Title"), String),
                            .Description = CType(reader("Description"), String),
                            .Link = CType(reader("Link"), String),
                            .Image = CType(reader("Image"), Byte()),
                            .SpecialOffer = CType(reader("Special_Offer"), Boolean)
                        }
                    End While
                End Using
            End Using
        End Using
    End Function
End Class

Intellisense 中有 0 个错误,它可以构建,但是当我 运行 网页时出现错误

System.InvalidCastException: Unable to cast object of type 'VB$StateMachine_4_GetAllFrontPageBanners' to type 'System.Collections.Generic.List`1[InfotelData.Mongoose.Data.FrontPageBanner]'.

Line 7:  
Line 8:      Protected Sub Page_Load(ByVal sender As Object, e As EventArgs) Handles Me.Load
Line 9:          Dim banners As List(Of FrontPageBanner) = cvRepo.GetAllFrontPageBanners()
Line 10:         If banners.Count() > 0 Then
Line 11:             rptUploadedBanners.DataSource = banners

调试在遇到 page_load 时给出相同的错误。

我明显感觉到用户错误是罪魁祸首。

GetAllFrontPageBanners returns 一个 IEnumerable(Of FrontPageBanner)(*) 而你正在尝试将其存储在 List(Of FrontPageBanner) 中。我很惊讶它没有给出编译时错误(你可能处于 Option Strict Off 模式)

您需要使用 .ToList 从可枚举列表中创建一个列表,例如:

Dim banners As List(Of FrontBanner) = cvRepo.GetAllFrontPageBanners.ToList

(*) 在内部迭代器块将函数转换为生成的"class-state-machine"(在您的案例中实现 IEnumerable(Of FrontBanner))。
这是您得到的奇怪名称,但您可以(并且应该)将其视为源代码中给出的 return 类型。
关于 here

的更多信息