更新:2007 年 11 月
从 C++ 托管扩展到 Visual C++ 2008,参数数组用于解析重载函数调用的优先级发生了更改。
在托管扩展和新语法中,都没有对 C# 和 Visual Basic 支持的参数数组的显式支持。而是使用属性标记普通数组,如下所示:
void Trace1( String* format, [ParamArray]Object* args[] );
void Trace2( String* format, Object* args[] );
虽然两者看起来是相同的,但是,对于 C# 或其他 CLR 语言,ParamArray 属性将此标记为每次调用时具有可变数量元素的数组。使用托管扩展的程序和使用新语法的程序中行为的更改是在重载函数集的解析中,其中一个实例声明省略号,另一个实例声明 ParamArray 属性,如 Artur Laksberg 提供的以下示例中所示。
int foo(...); // 1
int foo( [ParamArray] Int32[] ); // 2
在托管扩展中,省略号的优先级高于属性是合理的,因为属性不是该语言的正式方面。然而,在新语法中,现在该语言内直接支持参数数组,而且由于它的类型更强,它的优先级高于省略号。这样,在托管扩展中,调用
foo( 1, 2 );
解析为 foo(¡),而在新语法中,它解析为 ParamArray 实例。程序行为取决于省略号实例的调用优先于 ParamArray 的调用的可能性极小,一旦发生这种情况,您需要修改签名或调用。