Domanda

In seguito alla mia domanda precedente.

Qualcuno può spiegare perché il seguente codice viene compilato senza errori:

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

Tuttavia, ciò mi dà l'errore "C2440:" inizializzazione ": impossibile convertire da" 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")};
    )
};

Tutto quello che ho fatto è stato tentare di "annidare" l'array di parametri all'interno dell'inizializzazione dell'array del metodo ... Non direttamente, il costruttore di VdbMethodInfo accetta, come secondo argomento, un ParameterArray.

Sembra implicare che l'inizializzazione dell'array C ++ gestito prevede che qualsiasi annidamento ricorsivo abbia lo stesso tipo ... (vale a dire, penso che questo debba essere un bug)

Domanda correlata: qui

È stato utile?

Soluzione

Ho trovato una soluzione alternativa che rende comunque più pulita la sintassi. Uso il " ... " sintassi (equivalente al C ++ gestito in base alla parola chiave 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;
    }
};
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top