Parameterarray und Ellipse

Aktualisiert: November 2007

Die Rangfolge des Parameterarrays zum Auflösen von Aufrufen überladener Funktionen hat sich in Visual C++ 2008 gegenüber Managed Extensions for C++ geändert.

Sowohl in Managed Extensions als auch in der neuen Syntax gibt es keine explizite Unterstützung des Parameterarrays, das von C# und Visual Basic unterstützt wird. Stattdessen wird wie folgt ein gewöhnliches Array mit einem Attribut gekennzeichnet:

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

Während diese beiden Varianten gleich aussehen, kennzeichnet das ParamArray-Attribut dieses Array für C# oder andere CLR-Programmiersprachen als ein Array, das bei jedem Aufruf eine unterschiedliche Anzahl von Elementen aufnehmen kann. Das unterschiedliche Verhalten von Programmen mit Managed Extensions und der neuen Syntax besteht in der Auflösung einer Reihe von Funktionen, in der eine Instanz eine Ellipse deklariert und eine zweite Instanz ein ParamArray-Attribut deklariert, wie das folgende von Artur Laksberg zur Verfügung gestellte Beispiel zeigt.

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

In Managed Extensions hat die Ellipse Vorrang vor dem Attribut. Dies ist angemessen, da das Attribut keinen formalen Aspekt der Programmiersprache darstellt. In der neuen Syntax wird das Parameterarray jetzt jedoch direkt in der Programmiersprache unterstützt und hat Vorrang vor der Ellipse, da es eine striktere Typbindung hat. In Managed Extensions wird also der Aufruf

foo( 1, 2 );

nach foo(…) aufgelöst, während er in der neuen Syntax zur ParamArray-Instanz aufgelöst wird. In dem unwahrscheinlichen Fall, dass das Verhalten des Programms eher vom Aufruf der Ellipseninstanz als vom Aufruf der ParamArray-Instanz abhängt, müssen Sie entweder die Signatur oder den Aufruf ändern.

Siehe auch

Konzepte

Allgemeine Sprachänderungen