Ссылки на пространство имен в 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

Однако, если вы сделаете то же самое на С#...


using System;

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

Вы получите сообщение об ошибке в строке с возвратом «Collections.Generic.List», в котором говорится: «Тип или имя пространства имен «Collections» не могут быть найдены (вам не хватает директивы using или ссылки на сборку?)"

Я знаю, что для использования List у вас должна быть директива using для System.Collections.Generic, но я не знаю, почему. Я также не понимаю, почему я не получаю ту же ошибку в объявлении функции, а только в операторе возврата.

Я надеялся, что кто-то может объяснить это или даже направить меня на страницу technet, которая объясняет это. Я искал вокруг, но не могу найти ничего, что объясняет эту концепцию.

Изменить: просто отметим, что вопрос действительно касается ссылки на подпространство имен, например, в примере, который может ссылаться на коллекции в System.


person tcnolan    schedule 22.08.2009    source источник
comment
Ссылка: stackoverflow.com/questions/768905/namespace-and-sub- пространства имен   -  person Kirtan    schedule 22.08.2009


Ответы (3)


using в C# не разрешает это:

Создайте директиву using, чтобы использовать типы в пространстве имен без указания пространства имен. Директива using не дает вам доступа ни к каким пространствам имен, вложенным в указанное вами пространство имен.

Однако VB.NET поддерживает несколько ближе поведение с оператором Imports:

Объем элементов, предоставляемых оператором Imports, зависит от того, насколько конкретно вы используете оператор Imports. Например, если указано только пространство имен, все члены этого пространства имен с уникальными именами и члены модулей внутри этого пространства имен доступны без уточнения. Если указаны и пространство имен, и имя элемента этого пространства имен, только члены этого элемента доступны без уточнения.

Справочный вопрос SO

person Kirtan    schedule 22.08.2009
comment
Это потрясающе, не знаю, как я пропустил этот пост, я думаю, что моя строка поиска была недостаточно близкой. Спасибо! - person tcnolan; 22.08.2009

Это связано с тем, что VB.Net поддерживает частичные пространства имен; С# нет.

В Visual Basic System импортируется по умолчанию, а дочерние пространства имен разрешаются автоматически.

Подробнее читайте в этой статье.

VB.Net и C#, раунд 2: Частичные пространства имен

person rahul    schedule 22.08.2009
comment
Это потрясающая статья. Третий пост, я думаю, отвечает на вопрос наиболее прямо здесь, но это было очень полезно, поэтому я дал баллы. Спасибо! - person tcnolan; 22.08.2009
comment
@rahul, ссылка на статью о частичных пространствах имен не работает. - person CokoBWare; 16.01.2013

вы можете сказать System.Collections.Generic.List. это сработает.

Думаю, нужно привести весь список и не опускать системную часть.

ТАКЖЕ вам нужно будет шаблонировать его со строкой, как в списке, аналогичном списку (из строки)

person obelix    schedule 22.08.2009