从泛型类型转换为其约束接口

时间:2014-11-11 18:13:15

标签: vb.net generics type-conversion

我创建了一个泛型类,其约束为IComparable,如下所示:

Public Class Foo(Of T As IComparable)
    Private _f As T

    Public Sub New(ByVal f As T)
        _f = f
    End Sub

    Public Function GetBar() As Bar
        Return New Bar(Me) 'compiler error: Value of type Foo(of T) 
                           'cannot be converted to Foo(of IComparable)
    End Function

End Class

我有另一个类,它将构造函数参数作为定义的第一个类的对象:

Public Class Bar
    Private _foo As Foo(Of IComparable)

    Public Sub New(ByVal foo As Foo(Of IComparable))
        _foo = foo
    End Sub
End Class

但是,在尝试创建Bar对象时出现显示的错误。

任何人都可以解释为什么我会收到此错误?我希望编译器知道类型T是任何IComparable类型......

我发现了一个类似的问题here,但我不知道如何在我的情况下使用它。

1 个答案:

答案 0 :(得分:1)

  

我希望编译器知道类型T是任何IComparable类型......

是的,它知道 - 但是您的Bar构造函数期望Foo(Of IComparable)而不是Foo(Of T)其中T实现IComparable。您需要通用协方差,但不能将其应用于.NET中的类(仅限接口和委托)。

一个选项是使Bar也是通用的,另一个类型参数T被限制为实现IComparable。然后,您的Foo.GetBar()方法可能会返回Bar(Of T)