Bug nell'inizializzazione dell'array in Managed C ++ (followup)
-
08-07-2019 - |
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
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;
}
};