我可以在VB.NET中限定参数的类型吗?

时间:2009-04-08 06:37:33

标签: vb.net generics

这是两个问题(一个比另一个更具体)。

如果我有这样的方法:

Public Function Blah(String Foo)
End Function

我是否可以根据其他类型限定Foo(例如,我是否可以要求Foo是一个也实现IInterface的String?)。

我在想象一些与此类似的东西:

Public Function Blah(RandomObject Foo Where RandomObject Is IInterface)
End Function

此外,有没有办法限定Type参数?

例如,我可以要求Type I作为参数使用特定的类树吗?

Public Function Blah(Type t Where Type Of String)
End Function

我应该提到我在属性的属性上下文中使用它,因此类声明本身不能是通用的(这完全集中在限定方法参数而不是键入类及其方法)。

3 个答案:

答案 0 :(得分:3)

这看起来像是一个泛型的案例。您的方法签名在VB.NET中将是这样的:

Public Function Blah(Of T As {IImplementedByT})(Foo As T)

这指定Foo可以是任何类型T,只要T实现IImplementedByT即可。请注意,此方法可以是通用的,而不需要包含类是通用的。如果您希望T是从RandomClass派生的类,它也实现了此接口,您可以指定两个约束:

Public Function Blah(Of T As {RandomClass, IImplementedByT})(Foo As T)

答案 1 :(得分:1)

您可以先为通用类型执行此操作,但不能为非通用类型执行此操作。基本上变量(包括参数)只能有一个编译时类型,所以你不能说“它必须是FooIBar - 你必须选择一个或另一个。泛型让你说“它必须是某种类型T T派生自Foo并实现IBar”。

泛型是一个很大的话题 - 在Stack Overflow答案中无法覆盖 - 但微软有一个good introductory article

至于你的第二个问题 - 不,你不能这样做。 Type值仅在执行时已知,因此必须是执行时间检查。您可以使用Type.IsAssignableFrom轻松地编写该检查。

答案 2 :(得分:0)

不确定你的意思是“Foo是一个也实现了IInterface的字符串”。

字符串类是密封的,所以你不能继承它&因此你无法在它上面实现一个接口。

我希望我在正确的页面上。