2011-05-16 22 views
8

Hoy vi C# código que crea el diccionario estático y lo inicializa:Inicializar Diccionario estática mientras se crea en C++/CLI

public static readonly Dictionary<string, string> dict = new Dictionary<string, string>() 
     { 
      {"br","value1"}, 
      {"cn","value2"}, 
      {"de","value3"}, 
     }; 

pero cuando decidí escribir mismo código para C++/CLI, ocurrió un error. Aquí está mi intento:

static System::Collections::Generic::Dictionary<System::String^, System::String^>^ dict = gcnew System::Collections::Generic::Dictionary<System::String^, System::String^>() 
    { 
     {"br","value1"}, 
     {"cn","value2"}, 
     {"de","value3"}, 
    }; 

¿Puedo hacer esto y, de ser así, cómo?

+0

posible duplicación de [sintaxis del inicializador de la colección CLI de C++] (http://stackoverflow.com/questions/1923928/c-cli-collection-initializer-syntax) –

Respuesta

6

C# 3.0 y posterior permite a los usuarios definir un "inicializador"; para las colecciones, eso es una serie de elementos, que para los Diccionarios se optimiza para las claves y los valores. C++. NET, que yo sepa, no tiene esta función de idioma. Vea esta pregunta: es muy similar: Array initialization in Managed C++. Los inicializadores de matriz son ÚNICAMENTE tales inicializadores en C++; otras colecciones no las ofrecen en C++.

Básicamente, su opción principal es declarar un constructor estático e inicializar su diccionario allí.

3

Este tipo de inicialización de Dictionary<T> es una característica no de la clase en sí, sino del compilador de C#. Lo traduce en declaraciones separadas para la creación del objeto Dictionary<T> y la creación y adición de cada par clave/valor. No creo que el compilador C++ ofrezca las mismas capacidades.

+0

Significa que no puedo inicializarlo como lo hago en C#? –

+1

Correcto, tendría que hacerse de manera diferente. – dlev

+0

Básicamente, sí. Es una función de idioma de C# no disponible en C++ administrado. – KeithS

0

Mi enfoque es (.NET 4.5):

// file.h 
using namespace System; 
using namespace System::Collections::Generic; 
// SomeClass 
public://or private: 
    static Dictionary<String^, String^>^ dict = dictInitializer(); 
private: 
    static Dictionary<String^, String^>^ dictInitializer(); 

// file.cpp 
#include "file.h" 
Dictionary<String^, String^>^ SomeClass::dictInitializer(){ 
    Dictionary<String^, String^>^ dict = gcnew Dictionary<String^, String^>; 
    dict->Add("br","value1"); 
    dict->Add("cn","value2"); 
    dict->Add("de","value3"); 
    return dict; 
} 
0

Es posible! :-)
No es sencillo, pero con una función de ayuda pequeña puede crear un diccionario y init en una línea de código:

// helper class 
generic <class TKey, class TValue> 
ref class CDict 
{ 
public: 
    static Dictionary<TKey, TValue>^ CreateDictionary (...array<KeyValuePair<TKey, TValue>>^ i_aValues) 
    { 
    Dictionary<TKey, TValue>^ dict = gcnew Dictionary<TKey, TValue>; 
    for (int ixCnt = 0; ixCnt < (i_aValues ? i_aValues->Length : 0); ixCnt++) 
     dict->Add (i_aValues[ixCnt].Key, i_aValues[ixCnt].Value); 
    return dict; 
    } 
}; 

// Test 
ref class CTest 
{ 
public: 
    static Dictionary<int, String^>^ ms_dict = CDict<int, String^>::CreateDictionary (gcnew array<KeyValuePair<int, String^>> 
    { 
    KeyValuePair<int, String^>(1, "A"), 
    KeyValuePair<int, String^>(2, "B") 
    }); 
}; 

int main() 
{ 
    for each (KeyValuePair<int, String^> kvp in CTest::ms_dict) 
    Console::WriteLine (kvp.Key.ToString() + " " + kvp.Value); 
} 

Probado, trabajando.

Cuestiones relacionadas