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

9
在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”的行上收到一个错误,该错误会说“找不到类型或命名空间名称'Collections'(您是否缺少使用指令或程序集引用?)”
我知道您必须实际上使用System.Collections.Generic才能使用List,但我不知道为什么。 我也不明白为什么在函数声明中我没有得到同样的错误,而只有在返回语句中才有。
我希望有人能解释这个问题,甚至是引用一个技术页面来解释它。 我已经搜索过了,但找不到任何解释这个概念的东西。
编辑:请注意,问题实际上是关于引用子命名空间的,例如在示例中能够引用System中的Collections。

1
参考:https://dev59.com/iHRA5IYBdhLWcg3w9ivq - Kirtan
3个回答

5
这是因为VB.Net支持部分命名空间,而C#不支持。
使用Visual Basic时,默认导入System并自动解析子命名空间。
在这篇文章中阅读更多内容。 VB.Net vs C#, Round 2: Partial Namespaces

1
这是一篇很棒的文章。我认为第三篇回答了这里最直接的问题,但这篇文章非常有帮助,所以我给了分数。谢谢! - tcnolan
@rahul,关于部分命名空间的文章链接已经失效。 - CokoBWare

5

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

创建一个使用指示符,以使用命名空间中的类型,而不必指定命名空间。使用指示符不会让您访问任何嵌套在指定命名空间中的命名空间。

然而,VB.NET通过Imports语句支持更接近的行为:

通过导入语句提供的元素的范围取决于您在使用导入语句时的具体性。例如,如果只指定了一个命名空间,则该命名空间中所有具有唯一名称的成员及其子模块中的成员都可以在不需要限定词的情况下使用。如果同时指定了命名空间和该命名空间中某个元素的名称,则只有该元素的成员可以在不需要限定词的情况下使用。

参考SO问题


这太棒了,不知道我怎么错过了这篇文章,我猜我的搜索字符串可能不够接近。谢谢! - tcnolan

0

你可以说System.Collections.Generic.List,这样就可以了。

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

此外,你需要使用字符串模板,例如List类似于List(Of string)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接