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'(您是否缺少 using 指令或程序集引用?)”

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

我希望有人可以解释这一点,甚至让我参考解释它的技术网页面。我四处搜索,但找不到任何解释这个概念的东西。

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

4

3 回答 3

5

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

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

在本文中阅读更多内容。

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

于 2009-08-22T06:01:32.640 回答
5

usingC# 中的指令不允许这样做:

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

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

Imports 语句提供的元素的范围取决于您在使用 Imports 语句时的具体程度。例如,如果仅指定了一个命名空间,则该命名空间的所有唯一命名的成员以及该命名空间内的模块成员都可以无条件地使用。如果同时指定了命名空间和该命名空间的元素名称,则只有该元素的成员才可用,无需限定。

参考 SO 问题

于 2009-08-22T06:07:30.817 回答
0

你可以说 System.Collections.Generic.List。那行得通。

我认为您需要提供整个列表,而不是忽略系统部分。

此外,您需要使用类似于 List(Of string) 的 List 中的字符串对其进行模板化

于 2009-08-22T06:01:44.230 回答