Pergunta

Na sequência da minha pergunta anterior.

Alguém pode explicar por que os seguintes compila o código sem erros:

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

No entanto, isso me dá "C2440 de erro: 'inicializar': não é possível converter de 'VdbParameterInfo ^' para 'VdbMethodInfo ^"

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

Tudo o que eu tenho feito é tentativa de "ninho" da matriz de parâmetro dentro da inicialização de matriz método ... Não importa diretamente -. Construtor de VdbMethodInfo leva, como um segundo argumento, um ParameterArray

Ele parece implicar que conseguiu C ++ inicialização de matriz espera que qualquer assentamento recursiva para ter o mesmo tipo ... (ou seja, eu acho que isso deve ser um bug)

questão relacionada: aqui

Foi útil?

Solução

Eu encontrei uma solução alternativa que torna o limpador sintaxe de qualquer maneira. Eu uso a sintaxe "..." (Managed C ++ equivalente ao C # "params" palavra-chave "):

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top