использование директивы для импорта подпространств - PullRequest
3 голосов
/ 21 февраля 2011

Если я импортирую пространство имен следующим образом:

using System;

Почему я не могу получить доступ к подсистеме ввода-вывода следующим образом:

IO.FileInfo fi;

Insted Я должен написать либо целый путь:

System.IO.FileInfo fi;

Или импортировать все пространство имен IO и использовать класс без пространства имен

using System.IO;

FileInfo fi;

Я что-то здесь упускаю?

Ответы [ 3 ]

5 голосов
/ 21 февраля 2011

Хотя часто удобно думать в терминах «пространств имен» и «подпространств имен», в действительности существуют только имена типов.

В этом случае существует единственный тип: System.IO.FileInfo

Директива using позволяет компилятору добавлять System. к любому типу, чтобы увидеть, находит ли он совпадающее имя типа.Однако он не найдет IO.FileInfo, поскольку будет искать тип IO, содержащий вложенный тип FileInfo.

Способ разработки языка может показаться более громоздким, но этоустраняет путаницу имен вложенных типов и имен пространств имен, поскольку она ищет только типы в пространствах имен, определенных в директивах using.Это уменьшает вероятность коллизий именования типов.

2 голосов
/ 21 февраля 2011

C # на самом деле не имеет понятия подпространств. Точки в имени пространства имен предназначены только для целей логической организации.

System и System.IO - это два разных пространства имен для C #.

Если вам просто нужен класс FileInfo, вы можете сделать это:

using FileInfo = System.IO.FileInfo;
0 голосов
/ 21 февраля 2011

То, что вы пытаетесь сделать, работает, только если тип контекста находится в той же иерархии пространства имен, например:

namespace System {
  class MyClass {
    IO.FileInfo fi;
  }
}

Вы также можете иметь относительный импорт, например так:

namespace System {
  using IO;
}
...