Поделиться через


Массив Param и многоточие

В Visual C++ 2010 приоритет массива Param для разрешения перегруженных функций изменился по сравнению с управляемыми расширениями для C++.

Ни в управляемых расширениях, ни в новом синтаксисе нет явной поддержки для массива Param, которая имеется в C# и Visual Basic. Вместо этого обычный массив помечается флагом следующим образом:

void Trace1( String* format, [ParamArray]Object* args[] );
void Trace2( String* format, Object* args[] );

Поскольку массивы выглядят одинаково, атрибут ParamArray использует их для языка C# и других языков среды CLR в качестве массива с изменяющимся от вызова к вызову числом элементов. Разница между поведением программ, написанных с помощью управляемых расширений и нового синтаксиса, заключается в разрешении набора перегруженных функций, в котором один экземпляр объявляет многоточие, а второй — атрибут ParamArray, как показано в следующем примере, приведенном Артуром Ларксбергом.

int fx(...); // 1
int fx( [ParamArray] Int32[] ); // 2

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

fx( 1, 2 );

разрешается в fx(…), в то время как в новом синтаксисе — в экземпляр ParamArray. Если поведение программы зависит от приоритета вызова экземпляра с многоточием над массивом ParamArray, то необходимо изменить либо подпись, либо вызов.

См. также

Основные понятия

Общие изменения в языке