パラメータ配列と省略記号

更新 : 2007 年 11 月

オーバーロードされた関数の呼び出しを解決するためのパラメータ配列の優先順位は、Visual C++ 2008 では C++ マネージ拡張から変更されています。

マネージ拡張と新しい構文では、C# と Visual Basic でサポートされるパラメータ配列を明示的にサポートしていません。代わりに、次のように通常の配列を属性でフラグします。

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

いずれも同じように見えますが、ParamArray 属性を使用すると、C# または他の CLR 言語ではこれを呼び出すたびに、可変の要素数を持つ配列としてタグ付けされます。マネージ拡張と新しい構文のプログラムでの動作の違いは、オーバーロードされた関数セットの解決にあり、Artur Laksberg が紹介する次の例のように、1 つ目のインスタンスは省略記号を宣言し、2 つ目のインスタンスは ParamArray 属性を宣言します。

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

マネージ拡張では、省略記号が属性より優先されました。属性は言語の正式な特性ではないため、これは妥当なことです。ただし、新しい構文では、言語内でパラメータ配列が直接サポートされています。パラメータ配列はより厳しく型指定されているため、省略記号より優先されます。したがって、次の呼び出しは、

foo( 1, 2 );

マネージ拡張では foo(?c) に解決され、新しい構文では ParamArray インスタンスに解決されます。プログラムの動作が ParamArray の呼び出しより省略記号インスタンスの呼び出しを優先して依存している場合、シグネチャまたは呼び出しのいずれかを修正する必要があります。

参照

概念

言語の変更の概要