Вложенные псевдонимы в C # - PullRequest
9 голосов
/ 02 марта 2010

Я видел много ответов на проблему typedef в C #, которую я использовал, поэтому у меня есть:

using Foo = System.Collections.Generic.Queue<Bar>;

и это хорошо работает. Я могу изменить определение (особенно изменить Bar => Zoo и т. Д.) И все, что использует Foo изменения. Отлично.

Теперь я хочу, чтобы это работало:

using Foo = System.Collections.Generic.Queue<Bar>;
using FooMap = System.Collections.Generic.Dictionary<char, Foo>;

но C #, похоже, не нравится Foo во второй строке, хотя я определил его в первой.

Есть ли способ использовать существующий псевдоним как часть другого?

Редактировать: я использую VS2008

1 Ответ

15 голосов
/ 02 марта 2010

По стандарту похоже, что ответ - нет. От Раздел 16.3.1 , пункт 6:

1 Порядок, в котором с использованием псевдонимов-директив не имеет значения, и разрешение namespace-or-type-name, на которое ссылается директива using-alias не затрагивается самой директивой using-alias или другими директивами использования в немедленно содержащий компиляцию единица или тело пространства имен.

2 в других слова, пространство имен или имя типа директива using-alias определяется как если сразу содержащий блок компиляции или тело пространства имён нет директив использования.

Edit:

Я только что заметил, что версия по вышеуказанной ссылке немного устарела. Текст из соответствующего абзаца в 4-м издании является более подробным, но все же запрещает ссылаться на псевдонимы внутри других. Он также содержит пример, который делает это явным.

В зависимости от ваших потребностей в объеме и силе набора текста, вам может понадобиться что-то вроде:

class Foo : System.Collections.Generic.Queue<Bar>
{
}
...