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



我创建了一个具有约束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类型。。。

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

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

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

一种选择是使用另一个类型参数T使Bar也通用,该参数被约束为实现IComparable。那么您的Foo.GetBar()方法可能会返回一个Bar(Of T)

最新更新