2014-01-24 40 views
1

我有一个接口,像这样:VB.NET值类型的“类”被转换为“类型”

Public Interface IDescriptionIdentityPair 
    Property Id() As String 
    Property Description() As String 
End Interface 

我有一个类,如下所示:

Public Class DescriptionIdentityPair : Implements IDescriptionIdentityPair 

    Public Property Id As String Implements IDescriptionIdentityPair.Id 
    Public Property Description As String Implements IDescriptionIdentityPair.Description 

    Public Overrides Function ToString() As String 
     Return Description 
    End Function 
End Class 

我有一种方法像这样:

Public Shared Function AddEmptyRow(Of T As IDescriptionIdentityPair)(ByVal collection As IList(Of T)) As IList(Of T) 
    Dim AddEmptyRowToCollection = collection 
    collection.Insert(0, New DescriptionIdentityPair With {.Id = "", .Description = FxApplication.DefaultText}) 
    Return collection 
End Function 

我正在试图插入DescriptionIdentityPair类的新实例时,编译时错误,这种类型的价值。“ DescriptionIdentityPair“不能转换为T.我甚至尝试将DescriptionIdentityPair转换为它的接口(绝望),但这并没有解决问题。

+0

为什么在所有返回列表?任何调用'AddEmptyRow'方法的代码都已经清楚地引用了列表。 –

+0

@StevenDoggart为了使方法链可能? – MarcinJuraszek

+0

@MarcinJuraszek是的,我认为这将是唯一有效的原因。我只是怀疑它可能不是有任何好的理由。 –

回答

3

错误是正确的。考虑一个情况,当你有另一个类实现的接口:

Public Class AnotherDescriptionIdentityPair : Implements IDescriptionIdentityPair 

而你打电话给你的通用方法与T = AnotherDescriptionIdentityPair:当你尝试添加的DescriptionIdentityPair实例List(Of AnotherDescriptionIdentityPair)

Dim list As New List(Of AnotherDescriptionIdentityPair) 
AddEmptyRow(list) 

会发生什么?

您可以修复addint New通用的限制,以你的方法和初始化New T,而不是New DescriptionIdentityPair

Public Shared Function AddEmptyRow(Of T As {New, IDescriptionIdentityPair})(ByVal collection As IList(Of T)) As IList(Of T) 
    Dim AddEmptyRowToCollection = collection 
    collection.Insert(0, New T With {.Id = "", .Description = "DefaultDescription"}) 
    Return collection 
End Function 
+0

+1。但是你在下面的评论中解决了我的主要问题;我不知道IList不是协变的(除非它有一个获得索引器)! 我可以删除通用约束,现在只需使用IEnumerable(的IDescriptionIdentityPair)作为参数类型 – contactmatt

+0

@contactmatt但是您将无法将项添加到'IEnumerable',因为它是只读集合接口!您只能使用新元素和所有源元素返回新的“IEnumerable”,例如使用'Concat'扩展方法。 – MarcinJuraszek

+0

它似乎正在通过将IEnumerable参数转换为列表,然后将项目插入它。 – contactmatt