Ma question concerne en fait un moyen de contourner l'initialisation de champs statiques par C#. J'ai besoin de faire cela, dans ma tentative de dupliquer un enum de style Java. Voici un exemple du code qui montre le problème:Initialisation de champs statiques en C# à utiliser dans un motif enum
Une classe de base pour tous mes énumérations à hériter de
public class EnumBase
{
private int _val;
private string _description;
protected static Dictionary<int, EnumBase> ValueMap = new Dictionary<int, EnumBase>();
public EnumBase(int v, string desc)
{
_description = desc;
_val = v;
ValueMap.Add(_val, this);
}
public static EnumBase ValueOf(int i)
{
return ValueMap[i];
}
public static IEnumerable<EnumBase> Values { get { return ValueMap.Values; } }
public override string ToString()
{
return string.Format("MyEnum({0})", _val);
}
}
Un échantillon d'un ensemble énuméré:
public sealed class Colors : EnumBase
{
public static readonly Colors Red = new Colors(0, "Red");
public static readonly Colors Green = new Colors(1, "Green");
public static readonly Colors Blue = new Colors(2, "Blue");
public static readonly Colors Yellow = new Colors(3, "Yellow");
public Colors(int v, string d) : base(v,d) {}
}
C'est où le problème est:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("color value of 1 is " + Colors.ValueOf(2)); //fails here
}
}
Le code ci-dessus échoue car EnumBase.ValueMap contient zéro élément , car aucun des constructeurs de Color n'a encore été appelé.
Il semble que cela ne devrait pas être si difficile à faire, c'est possible en Java, je sens qu'il me manque quelque chose ici?
mais ne devrait pas le constructeur statique pour les couleurs, qui initialiser toutes les variables membres statiques (qui sont, à leur tour, les couleurs) ont été appelés? – SirPentor
Oui, désolé je l'ai mieux qualifié maintenant. Seuls les constructeurs d'instance ne seront pas appelés. –
Je ne comprends toujours pas pourquoi les constructeurs d'instance ne seront pas appelés. Ils sont instanciés dans le constructeur statique, qui s'appelle, n'est-ce pas? Qu'est-ce que je ne reçois pas ici? – SirPentor