托管C ++中的数组初始化中的错误(后续)

时间:2009-05-07 15:08:28

标签: .net c++ managed-c++

跟进我之前的问题。

任何人都可以解释为什么下面的代码编译没有任何错误:

typedef array<VdbMethodInfo^> MethodArray;
typedef array<VdbParameterInfo^> ParameterArray;
ParameterArray^ parameters = gcnew ParameterArray {
    gcnew VdbParameterInfo("name", "string", "Paul")};
MethodArray^ methods = gcnew MethodArray {
    gcnew VdbMethodInfo("createTable", parameters)
};

然而这给了我“错误C2440:'初始化':无法从'VdbParameterInfo ^'转换为'VdbMethodInfo ^”

typedef array<VdbMethodInfo^> MethodArray;
typedef array<VdbParameterInfo^> ParameterArray;
MethodArray^ methods = gcnew MethodArray {
    gcnew VdbMethodInfo("createTable", gcnew ParameterArray {
        gcnew VdbParameterInfo("name", "string", "Paul")};
    )
};

我所做的就是尝试在方法数组初始化中“嵌套”参数数组...不直接介意 - VdbMethodInfo的构造函数将第二个参数作为ParameterArray。

似乎暗示托管C ++数组初始化期望任何递归嵌套都具有相同的类型......(即我认为这必定是一个错误)

相关问题:here

1 个答案:

答案 0 :(得分:2)

我找到了一种解决方法,无论如何都会使语法更清晰。我使用“...”语法(托管C ++相当于C#“params”关键字“):

public ref class MetaData
{
    typedef array<VdbMethodInfo^> MethodArray;
    typedef array<VdbParameterInfo^> ParameterArray;
    static ParameterArray^ params(... ParameterArray^ p)
    {
        return p;
    }
public:
    static array<VdbMethodInfo^>^ Instance()
    {
        ParameterArray^ parameters = gcnew ParameterArray { gcnew VdbParameterInfo("name", "string", "Paul")};
        MethodArray^ methods = gcnew MethodArray {
            gcnew VdbMethodInfo("createTable",
                params(gcnew VdbParameterInfo("name", "string", "Paul"),
                       gcnew VdbParameterInfo("age", "number", "25")))
        };

        return methods;
    }
};