簡體   English   中英

我的通用方法有什么問題?

[英]What's wrong with my generic method?

以下通用方法給出了編譯錯誤“錯誤13類型'Distribution'的值不能轉換為't'”:

Public Shared Function CreateObject(Of t)(ByVal ID As Integer) As t

        Dim TType As Type = GetType(t)

        If TType Is GetType(Distribution) Then
            Return CreateDistribution(ID)

        ElseIf TType Is GetType(Accrual) Then
            Return CreateAccrual(ID)

        End If


    End Function

CreateDistribution返回“ Distribution”類型的對象。 我正在嘗試獲取一種方法,該方法根據提供的t的類型執行操作,然后返回類型為t的對象。 我究竟做錯了什么?

**編輯:我已經注釋掉除了類聲明以外的所有Distribution,並且仍然收到相同的錯誤。

不管您是否使用if語句,編譯器都無法提前知道CreateDistribution的返回類型將與類型t相匹配。 將線路更改為此有效嗎?

Return CType(CreateDistribution(ID), t)

顯然,第二次相同。

您需要向上轉換到Object的返回值,然后向下轉換到t

例如:

Return CType(CType(CreateDistribution(ID), Object), t)

這兩個轉換是必需的,因為編譯器不知道tDistribution 因此,它不允許您從Distributiont (就編譯器而言,它可能是Integer )。 但是,一旦您轉換為Object ,第二次轉換就可以了,因為Object可以定義為t ,無論t是什么類型。
先發制人的狡猾評論:是的,我知道這對指針不是正確的。

泛型方法是在編譯時解析的,因此編譯器需要預先知道將使用哪種類型的T來編譯函數。 看起來您希望基於運行時檢查進行返回,在這種情況下,您將需要一個返回對象的方法,而不是泛型,該對象是所有可能的返回值所繼承的對象。 您可以使用的最基本的對象是對象-但是顯然無論您從哪里調用它,都必須進行某種類型檢查。

我認為您總是會出錯,因為至少有一個return語句將具有類型不匹配。 幾乎可以肯定,編譯器不夠聰明,無法解決在給定的t只能執行其中一個的問題。

這是完成您要嘗試執行的操作的更通用的方法:

    Public Function CreateInstance(Of T)(ByVal ParamArray args() As Object) As T
        Dim obj As T

        If args IsNot Nothing AndAlso args.Length > 0 Then
            obj = CType(Activator.CreateInstance(GetType(T), args), T)
        Else
            obj = Activator.CreateInstance(Of T)()
        End If

        Return obj
    End Function

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM