Выражение C # оценивается в пространство имен - PullRequest
3 голосов
/ 20 августа 2009

MSDN docs state "Выражение - это фрагмент кода, который может быть оценен как одно значение, объект, метод или пространство имен."

Может кто-нибудь объяснить, что означает выражение для оценки в пространстве имен - как это может быть?

редактировать: исправлена ​​опечатка

Ответы [ 4 ]

10 голосов
/ 20 августа 2009

Так определяется грамматика. Посмотрите на:

System.String

- это выражение, содержащее оператор точки, который работает с парой различных выражений. System само по себе считается выражением. Выражение может быть простым, например, одним идентификатором или литералом (подсказка: оно определено рекурсивно.)

Выражения (раздел спецификации C # 3.5 §7.1: Классификация выражений)

Выражение классифицируется как одно из следующих:
...
Пространство имен. Выражение с этой классификацией может появляться только как левая часть доступа к члену (§7.5.4). В любом другом контексте выражение, классифицированное как пространство имен, вызывает ошибку во время компиляции.

Неспособность использовать его как, скажем, аргумент метода, не дисквалифицирует его как выражение.

3 голосов
/ 20 августа 2009

На на этой странице MSDN написано:

Однако , хотя имя пространства имен классифицируется как выражение, это делает не оценить значение и, следовательно, никогда не может быть конечным результатом любого выражение. Вы не можете передать имя пространства имен для параметра метода, или использовать его в новом выражении, или присвоить его переменной. Ты можешь только использовать его как подвыражение в большем выражение. То же самое верно для типов (в отличие от System .. ::. Type объекты), имена групп методов (как отличается от конкретных методов), и событие добавить и удалить аксессоры.

Так что на самом деле вы ничего не можете сделать с пространством имен, являющимся выражением, оно всегда работает одинаково, в этом нет ничего динамичного, на что вы можете повлиять, но для синтаксического анализатора пространство имен должно быть чем-то :). Причина, по которой это выражение, связана с грамматикой языка C #, который используется для анализа кода во время процесса компиляции. Он состоит из операторов, выражений, операторов и т. Д., Поэтому в случае System.Guid yourGuid = System.Guid.NewGuid () часть System будет выражением, содержащим пространство имен. будет оператором, а Guid будет типом для синтаксического анализатора C #.

0 голосов
/ 20 августа 2009

Вы можете использовать выражение вроде этого:

using OutlookStuff = Microsoft.Office.Outlook.This.Is.Really.Long.Isnt.It;

, а затем сможете использовать выражение позже в коде. Это может быть полезно, когда возникает конфликт пространства имен, например, если у вас есть класс, такой как MailItem, или что-то общее для нескольких пространств имен.

Итак, теперь вы можете сделать это:

var mailItem = new OutlookStuff.MailItem();

РЕДАКТИРОВАТЬ Я думаю, что ответ Мехрдада является более правильным, но я подумал, что это стоит отметить.

0 голосов
/ 20 августа 2009
foo = System;

System оценивает пространство имен.

(Конечно, это не скомпилируется, потому что вы не можете присвоить пространство имен переменной, но вы поняли идею.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...