Frage

Nach meiner vorherigen Frage auf.

Kann mir jemand erklären, warum der folgende Code kompiliert ohne Fehler:

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

Doch das gibt mir "Fehler C2440: 'Initialisierung': Konvertierung von 'VdbParameterInfo ^' auf‚VdbMethodInfo ^"

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

Alles, was ich getan habe, ist Versuch, „Nest“ der Parameter-Array innerhalb der Methode Feldinitialisierung ... Nicht direkt etwas dagegen -. VdbMethodInfo Konstruktor nimmt, als zweites Argument, eine ParameterArray

Es scheint, dass Managed C ++ Feldinitialisierung zu implizieren, erwartet jede rekursive Verschachtelung die gleiche Art haben ... (das heißt ich glaube, das ein Fehler sein muss)

Verwandte Frage: hier

War es hilfreich?

Lösung

Ich habe eine Abhilfe gefunden, die die Syntax Reiniger ohnehin macht. Ich benutze die "..." Syntax (Managed C ++ entspricht dem C # "params" Schlüsselwort "):

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;
    }
};
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top