Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
13
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

7.6.4.1Идентичные простые имена и имена типов

В методе доступа к члену в виде E.I, где E является простым идентификатором, а значение E в качестве простого_имени (§7.6.2) является константой, полем, свойством, локальной переменной или параметром того же типа, что и значение E в качестве имени_типа (§3.8), то допустимы оба возможных значения E. Два возможных значения E.I никогда не являются неоднозначными, поскольку I в обоих случаях обязательно должен быть членом типа E. Другими словами, это правило просто разрешает доступ к статическим членам и вложенным типам E, когда в противном случае возникла бы ошибка времени компиляции. Например:

struct Color { public static readonly Color White = new Color(...); public static readonly Color Black = new Color(...);

public Color Complement() {...} }

class A { public Color Color; // Field Color of type Color

void F() { Color = Color.Black; // References Color.Black static member Color = Color.Complement(); // Invokes Complement() on Color field }

static void G() { Color c = Color.White; // References Color.White static member } }

Внутри класса A вхождения идентификатора Color, которые ссылаются на тип Color, подчеркиваются, а которые ссылаются на поле Color, не подчеркиваются.

7.6.4.2Грамматическая неоднозначность

Порождения для простого_имени (§7.6.2) и доступа_к_члену (§7.6.4) могут привести к появлению неоднозначности в грамматике выражений. Например, оператор

F(G<A,B>(7));

может интерпретироваться как вызов F с двумя аргументами, G < A и B > (7). Иначе он может интерпретироваться как вызов F с одним аргументом, который представляет собой вызов универсального метода G с двумя аргументами типа и одним обычным аргументом.

Если последовательность лексем (в контексте) можно разобрать как простое_имя (§7.6.2), метод_доступа_к_члену (§7.6.4) или метод_доступа_к_указателю_члена (§18.5.2), заканчивающийся списком_аргументов_типа (§4.4.1), то выполняется проверка лексемы, следующей непосредственно за закрывающей лексемой >. Если это одна из лексем

( ) ] } : ; , . ? == != | ^

то список_аргументов_типа остается в составе простого_имени, доступа_к_члену или доступа_к_члену-указателю, а любой другой возможный разбор последовательности лексем игнорируется. Иначе список_аргументов_типа не считается частью простого_имени, доступа_к_члену или доступа_к_члену-указателю, даже если не существует другого возможного разбора последовательности лексем. Обратите внимание, что эти правила не применяются при разборе списка_аргументов_типа в имени_пространства_имен_или_типа (§3.8). Оператор

F(G<A,B>(7));

в соответствии с этим правилом будет интерпретироваться как вызов F с одним аргументом, который представляет собой вызов универсального метода G с двумя аргументами типа и одним обычным аргументом. Каждый оператор

F(G < A, B > 7); F(G < A, B >> 7);

будет интерпретирован как вызов F с двумя аргументами. Оператор

x = F < A > +y;

будет интерпретирован как оператор «меньше чем», оператор «больше чем» и унарный оператор «плюс», как если бы выражение было записано в виде x = (F < A) > (+y), а не в виде простого_имени со списком_аргументов_типа, за которым следует бинарный оператор «плюс». В операторе

x = y is C<T> + z;

лексемы C<T> интерпретируются как имя_пространства_имен_или_типа со списком_аргументов_типа.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]