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

7.5.1.2Вычисление списков аргументов во время выполнения

При обработке вызова функции-члена во время выполнения (§7.5.4) выражения или ссылки на переменные списка аргументов вычисляются слева направо в следующем порядке.

  • Для параметра значения вычисляется выражение аргумента и выполняется неявное преобразование (§6.1) в соответствующий тип параметра. Результат становится исходным значением параметра значения при вызове функции-члена.

  • Для параметра ссылки или вывода вычисляется ссылка на переменную и получившееся расположение в памяти становится расположением, которое представляется параметром при вызове функции-члена. Если ссылка на переменную, предоставленная в виде параметра ссылки или вывода, является элементом массива ссылочного_типа, во время выполнения проверяется, совпадает ли тип элемента массива с типом параметра. Если эта проверка не проходит, вызывается исключение System.ArrayTypeMismatchException.

В методах, индексаторах и конструкторах экземпляров самый правый параметр может объявляться массивом параметров (§Error: Reference source not found). Такие функции-члены вызываются либо в нормальной форме, либо в расширенной в зависимости от того, какая из форм применима (§7.5.3.1):

  • Когда функция-член с массивом параметров вызывается в нормальной форме, аргумент массива параметров должен быть одним выражением с типом, который можно неявно преобразовать (§6.1) в тип массива параметров. В этом случае использование массива параметров не отличается от использования параметра значения.

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

Выражения списка аргументов всегда вычисляются в порядке их записи. Таким образом, в примере

class Test { static void F(int x, int y = -1, int z = -2) { System.Console.WriteLine("x = {0}, y = {1}, z = {2}", x, y, z); }

static void Main() { int i = 0; F(i++, i++, i++); F(z: i++, x: i++); } }

дает в результате

x = 0, y = 1, z = 2 x = 4, y = -1, z = 3

По правилам ковариации массива (§12.5) значение массива типа A[] может быть ссылкой на экземпляр массива типа B[], если существует неявное преобразование ссылочного типа из B в A. Согласно этим правилам, когда элемент массива ссылочного_типа передается в качестве параметра ссылки или вывода, во время выполнения необходимо убедиться, что фактический тип элементов массива идентичен типу параметра. В примере

class Test { static void F(ref object x) {...}

static void Main() { object[] a = new object[10]; object[] b = new string[10]; F(ref a[0]); // Ok F(ref b[1]); // ArrayTypeMismatchException } }

при втором вызове F будет вызвано исключение System.ArrayTypeMismatchException, потому что фактическим типом b является string, а не object.

Когда функция-член с массивом параметров вызывается в расширенной форме, вызов обрабатывается точно так же, как если бы для расширенных параметров было указано выражение создания массива с инициализатором массива (§7.6.10.4). Например, при объявлении

void F(int x, int y, params object[] args);

следующие вызовы расширенной формы метода

F(10, 20); F(10, 20, 30, 40); F(10, 20, 1, "hello", 3.0);

в точности соответствуют

F(10, 20, new object[] {}); F(10, 20, new object[] {30, 40}); F(10, 20, new object[] {1, "hello", 3.0});

В частности, обратите внимание, что когда в массиве параметров аргументы не передаются, создается пустой массив.

Когда аргументы в функции-члене с соответствующими необязательными параметрами пропускаются, выполняется неявная передача аргументов по умолчанию объявления функции-члена. Так как они всегда постоянны, их вычисление не повлияет на порядок вычисления остальных аргументов.

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