Question

Suite de ma question précédente.

Quelqu'un peut-il expliquer pourquoi le code suivant est compilé sans erreur:

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

Pourtant, cela me donne "l'erreur C2440: 'initialisation': impossible de convertir de 'VdbParameterInfo ^' en 'VdbMethodInfo ^"

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

Tout ce que j'ai fait est d'essayer de "imbriquer". le tableau de paramètres à l'intérieur de l'initialisation du tableau de méthode ... Pas directement l'esprit - le constructeur de VdbMethodInfo prend, comme second argument, un ParameterArray.

Cela semble impliquer que l'initialisation d'un tableau C ++ géré s'attend à ce que toute imbrication récursive ait le même type ... (c'est-à-dire que je pense que cela doit être un bogue)

Question liée: ici

Était-ce utile?

La solution

J'ai trouvé une solution de contournement qui rend de toute façon la syntaxe plus propre. J'utilise le " ... " syntaxe (équivalent C ++ géré du C # "params" "mot clé"):

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;
    }
};
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top