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

18.4.1 Массивы указателей

В небезопасном контексте можно формировать массивы указателей. В массивах указателей разрешены лишь некоторые преобразования, применимые к другим типам массива:

  • Неявное преобразование ссылочного типа (§6.1.6) из любого типа_массива в System.Array и реализуемые им интерфейсы применимо и к массивам указателей. Однако любая попытка получить доступ к элементам массива с помощью System.Array или реализуемых им интерфейсов приведет к исключению во время выполнения, так как типы указателей не могут быть преобразованы в object.

  • Явное и неявное преобразование ссылочных типов (§6.1.6, §6.2.4) из типа одномерных массивов S[] в System.Collections.Generic.IList<T> и его базовые интерфейсы не применимы к массивам указателей, поскольку типы указателей не могут использоваться в качестве аргументов типа, а преобразования из типов указателей в типы, не являющиеся типами указателей, невозможны.

  • Явное преобразование ссылочного типа (§6.2.4) из System.Array и реализуемых им интерфейсов в любой тип_массива применимо к массивам указателей.

  • Явное преобразование ссылочного типа (§6.2.4) из System.Collections.Generic.IList<S> и его базовых интерфейсов в тип одномерных массивов T[] не применимо к массивам указателей, поскольку типы указателей не могут использоваться в качестве аргументов типа, и преобразования из типов указателей в типы, не являющиеся типами указателей, невозможены.

Эти ограничения означают, что расширение оператора foreach на массивы, описанные в §8.8.4, не применимы к массивам указателей. Вместо этого оператор foreach, заданный в виде

foreach (V v in x) внедренный_оператор

, где x имеет тип массива вида T[,,…,], n – число измерений минус 1, а T или V имеют тип указателя, развернут с помощью вложенных циклов оператора for:

{ T[,,…,] a = x; V v; for (int i0 = a.GetLowerBound(0); i0 <= a.GetUpperBound(0); i0++) for (int i1 = a.GetLowerBound(1); i1 <= a.GetUpperBound(1); i1++) … for (int in = a.GetLowerBound(n); in <= a.GetUpperBound(n); in++) { v = (V)a.GetValue(i0,i1,…,in); внедренный_оператор } }

Переменные a, i0, i1, … in невидимы или недоступны для x, внедренного_оператора или любого другого исходного кода программы. The variable v is read-only in the embedded statement. Если не определено явное преобразование (§18.4) типа T (типа элементов) в V, возникает ошибка, и больше никакие действия не выполняются. Если x имеет значение null, во время выполнения генерируется исключение System.NullReferenceException.

18.5Указатели в выражениях

В небезопасном контексте выражение может давать результат типа указателя, но вне небезопасного контекста выражение с типом указателя вызывает ошибку времени компиляции. Говоря точно, ошибка времени компиляции вне небезопасного контекста вызывается в случае, когда любое простое_имя (§7.6.2), доступ_к_члену (§7.6.4), выражение_вызова (§7.6.5) или доступ_к_элементу (§7.6.6) имеет тип указателя.

В небезопасном контексте порождения первичного_выражения_создания_не_массива (§7.6) и унарного_выражения (§7.7) дают возможность создавать следующие дополнительные конструкции:

первичное_выражение_создания_не_массива: ... доступ_к_элементу_по_указателю доступ_к_элементу_по_указателю выражение_sizeof

унарное_выражение: ... выражение_косвенного_обращения_по_указателю выражение_адрес

Эти конструкции описаны в следующих разделах. Приоритет и ассоциативность небезопасных операторов подразумеваются грамматикой.

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