类型参数不能用作限定符

时间:2008-11-08 01:31:07

标签: vb.net generics

VB.NET2005

简化代码:

 MustInherit Class InnerBase(Of Inheritor)
End Class

MustInherit Class OuterBase(Of Inheritor)
    Class Inner
        Inherits InnerBase(Of Inner)
    End Class
End Class

Class ChildClass
    Inherits OuterBase(Of ChildClass)
End Class

Class ChildClassTwo
    Inherits OuterBase(Of ChildClassTwo)
End Class

MustInherit Class CollectionClass(Of _
        Inheritor As CollectionClass(Of Inheritor, Member), _
        Member As OuterBase(Of Member))
    Dim fails As Member.Inner ' Type parameter cannot be used as qualifier
    Dim works As New ChildClass.Inner
    Dim failsAsExpected As ChildClassTwo.Inner = works ' type conversion failure
End Class

“失败”行上的错误消息在主题中,并且“Member.Inner”突出显示。顺便提一下,尝试调用OuterBase的共享方法时会出现同样的错误。

“作品”系列有效,但现实生活中有十几个(并且正在计算)的ChildClass课程。

“failedAsExpected”行显示,使用泛型,每个ChildClass都有自己独特的内部类。

我的问题:有没有办法在类CollectionClass中获取变量,定义为类型Member.Inner?编译器无法遵循的重要区别是什么?

(我最终能够通过创建param类型的虚拟对象并调用OuterBase中定义的方法来生成对象。不是最干净的方法。)

编辑2008/12/2更改的代码,使两个“基础”类通用。

2 个答案:

答案 0 :(得分:1)

Dim succeeds as OuterBase.Inner

.net确实拥有C ++的模板类和typedef的组合,这意味着你想要做的事情是不可能的,甚至在.net中也没有意义。

答案 1 :(得分:1)

ChildClass.InnerSomeOtherChildClass.Inner属于同一类型。这是一个简短但完整的程序来演示:

Imports System

MustInherit Class InnerBase
End Class

MustInherit Class OuterBase
   Class Inner
      Inherits InnerBase
   End Class
End Class

Class ChildClass
   Inherits OuterBase
End Class

Class OtherChildClass
   Inherits OuterBase
End Class

Class Test
    Shared Sub Main()
        Dim x as new ChildClass.Inner
        Dim y as new OtherChildClass.Inner

        Console.WriteLine(x.GetType())
        Console.WriteLine(y.GetType())
    End Sub
End Class

输出结果为:

OuterBase+Inner
OuterBase+Inner

你想通过使用“参数化”嵌套类来实现什么?我怀疑 它不会按照你想要的方式工作,只需使用OuterBase.Inner开始就可以实现它。

现在,如果您的每个子类都声明了自己的嵌套类,那将是一种不同的情况 - 而且泛型不会帮助您。