Pregunta

Seguimiento de mi pregunta anterior.

¿Alguien puede explicar por qué el siguiente código se compila sin ningún error:

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)
};

Sin embargo, esto me da " error C2440: 'inicializando': no ??se puede convertir de 'VdbParameterInfo ^' a 'VdbMethodInfo ^ "

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

Todo lo que he hecho es intentar '' anidar '' la matriz de parámetros dentro de la inicialización de la matriz de métodos ... No importa directamente: el constructor de VdbMethodInfo toma, como segundo argumento, una matriz de parámetros.

Parece implicar que la inicialización de la matriz C ++ administrada espera que cualquier anidamiento recursivo tenga el mismo tipo ... (es decir, creo que esto debe ser un error)

Pregunta relacionada: aquí

¿Fue útil?

Solución

He encontrado una solución que hace que la sintaxis sea más limpia de todos modos. Yo uso el " ... " sintaxis (C ++ administrado equivalente a la palabra clave 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;
    }
};
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top