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

7.6.11Оператор typeof

Оператор typeof используется для получения объекта System.Type для типа.

выражение_typeof: typeof ( тип ) typeof ( имя_непривязанного_типа ) typeof ( void )

имя_непривязанного_типа: идентификатор спецификация_универсального_измерениянеобязательно идентификатор :: идентификатор спецификация_универсального_измерениянеобязательно имя_непривязанного_типа . идентификатор спецификация_универсального_измерения необязательно

спецификация_универсального_измерения: < запятыенеобязательно >

запятые: , запятые ,

Выражение_typeof первого типа состоит из ключевого слова typeof, за которым следует тип в скобках. Результатом выражения этого типа является объект System.Type для указанного типа. Для любого типа существует только один объект System.Type. Это означает, что для типа T всегда выполняет равенство typeof(T) == typeof(T). Тип не может быть динамическим.

Выражение_typeof второго типа состоит из ключевого слова typeof, за которым следует непривязанное_имя_типа в скобках. Непривязанное_имя_типа очень похоже на имя_типа (§3.8) за исключением того, что непривязанное_имя_типа содержит универсальные_спецификаторы_измерения, тогда как имя_типа содержит списки_аргументов_типа. Когда операнд выражения_typeof является последовательностью лексем, соответствующей правилам формирования непривязанного_имени_типа и имени_типа, а именно когда он не содержит ни универсального_спецификатора_измерения, ни списка_аргументов_типа, то последовательность лексем считается именем_типа. Значение непривязанного_имени_типа определяется следующим образом.

  • Последовательность лексем преобразуется в имя_типа путем замены каждого универсального_спецификатора_измерения на список_аргументов_типа с таким же числом запятых и ключевым словом object, как и у каждого аргумента_типа.

  • Получившееся имя_типа вычисляется, причем все ограничения параметра типа игнорируются.

  • Непривязанное_имя_типа разрешается в непривязанный универсальный метод, связанный с результирующим сформированным типом (§4.4.3).

Результатом выражения_typeof является объект System.Type для результирующего непривязанного универсального типа.

Выражение_typeof третьего типа состоит из ключевого слова typeof, за которым следует ключевое слово void в скобках. Результатом выражения этого типа является объект System.Type, обозначающий отсутствие типа. Объект типа, возвращаемый выражением typeof(void), отличается от объекта типа, возвращаемого для любого типа. Этот специальный объект типа удобно использовать в библиотеках классов, которые допускают отражение в методы языка, где для этих методов желательно иметь способ представления типа возвращаемого значения, включая методы, возвращающие void, с помощью экземпляра System.Type.

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

В примере

using System;

class X<T> { public static void PrintTypes() { Type[] t = { typeof(int), typeof(System.Int32), typeof(string), typeof(double[]), typeof(void), typeof(T), typeof(X<T>), typeof(X<X<T>>), typeof(X<>) }; for (int i = 0; i < t.Length; i++) { Console.WriteLine(t[i]); } } }

class Test { static void Main() { X<int>.PrintTypes(); } }

получается следующий вывод:

System.Int32 System.Int32 System.String System.Double[] System.Void System.Int32 X`1[System.Int32] X`1[X`1[System.Int32]] X`1[T]

Обратите внимание, что int и System.Int32 являются одним типом.

Также обратите внимание, что результат выражения typeof(X<>) не зависит от аргумента типа, а результат typeof(X<T>) зависит.

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