C#与VB.Net中的命名空间引用

在VB.Net中你可以做如下的事情,没有任何问题…只是忽略这是一个非常无用的类的事实:-)

Imports System Public Class Class1 Public Shared Function ArrayToList(ByVal _array() As String) As Collections.Generic.List(Of String) Return New Collections.Generic.List(Of String)(_array) End Function End Class 

但是如果你在C#中做同样的事情……

 using System; public class Class1 { public static Collections.Generic.List ArrayToList(string[] _array) { return new Collections.Generic.List(_array); } } 

您将在“Collections.Generic.List”上返回“无法找到类型或命名空间名称’集合’(您是否缺少using指令或程序集引用?)”行中出现错误。

我知道你必须实际使用System.Collections.Generic的using指令才能使用List,但我不知道为什么 。 我也不明白为什么我在函数声明中没有得到相同的错误,只是在return语句中。

我希望有人可以解释这一点,甚至可以将我推荐给解释它的technet页面。 我四处搜寻,但找不到任何解释这个概念的东西。

编辑:请注意,问题实际上是关于子命名空间的引用,例如在示例中能够引用系统中的集合。

在C# 中 using指令不允许这样:

创建using指令以使用命名空间中的类型,而无需指定命名空间。 using指令不允许您访问嵌套在指定名称空间中的任何名称空间。

但是,VB.NET 支持 Imports语句更接近的行为:

Imports语句提供的元素范围取决于使用Imports语句时的具体情况。 例如,如果仅指定了名称空间,则该名称空间的所有唯一命名成员以及该名称空间中的模块成员都可以无限制地使用。 如果同时指定了命名空间和该命名空间的元素名称,则只有该元素的成员可以无限制地使用。

参考SO问题

这是因为VB.Net支持部分名称空间 ; C#没有。

使用Visual Basic,默认情况下会导入System,并自动解析子命名空间。

阅读本文的更多内容。

VB.Net vs C#,第2轮:部分命名空间

你可以说System.Collections.Generic.List。 那会有用。

我认为你需要给出整个列表而不是省略系统部分。

另外你需要使用字符串来模拟它,如列表中的List(Of String)