Question

public class ClassA
{
    public static readonly string processName;
} 

public class ClassB : ClassA
{
    static ClassB()
    {
        processName = "MyProcess.exe";
    }
}

Je reçois une erreur lors de la compilation du code C # ci-dessus.

L'erreur indique - & "; Un champ statique en lecture seule ne peut pas être affecté (sauf dans un constructeur statique ou un initialiseur de variable) &";

Mais je l'assigne dans un constructeur statique.

La nécessité d'une telle variable statique est que, la classe de base a des méthodes qui utilisent cette variable, mais les classes dérivées et la classe de base doivent avoir des valeurs différentes pour cette variable. Mais la valeur est constante dans toutes les instances de la classe respective. Il doit être en lecture seule car il ne doit être changé nulle part.

Quelle est l'erreur dans le code ci-dessus? (S'il y en a) Je ne semble pas pouvoir en repérer un. Le message d'erreur n'aide pas. Comme je ne fais rien de mal en conséquence.

En cas d'erreur, comment puis-je implémenter cette fonctionnalité? Je sais qu'une solution de contournement simple consisterait à en faire une variable d'instance et à leur attribuer différentes valeurs dans les classes dérivées. Mais cela n’est pas nécessaire, car la valeur est constante dans toutes les instances de la classe respective.

Était-ce utile?

La solution

Vous affectez cependant dans le constructeur statique mauvais statique. Il ne peut être affecté que dans un constructeur statique pour le type déclarant la variable .

Supposons que vous ayez une autre classe dérivée de ClassC qui fasse la même chose - vous écraseriez la variable, ce qui est censé être en lecture seule. Il y a une unique variable statique ici, quel que soit le nombre de classes dérivées que vous avez.

Une solution consiste à éviter d'utiliser une variable statique, mais de placer une propriété virtuelle dans la classe de base et de faire en sorte que chaque classe dérivée remplace la propriété pour renvoyer une constante différente:

public class ClassA
{
    public virtual string ProcessName { get { return "ClassAProcess"; } }
} 

public class ClassB : ClassA
{
    public override string ProcessName { get { return "MyProcess.exe"; } }
}

En gros, l’option serait de séparer les & "statiques &"; Bits dans une hiérarchie distincte - en réalité, il semblerait que vous souhaitiez un polymorphisme sur le type plutôt que sur les instances, ce qui n'est pas pris en charge dans .NET.

Autres conseils

Dans votre exemple, un seul champ existera, celui de la classe de base et vous ne pouvez pas avoir différentes valeurs dans un seul champ. De plus, vous ne pouvez initialiser que readonly des champs de la même classe, pas des classes dérivées. Une solution de contournement pourrait être de définir une classe générique telle que:

static class ProcessNames<T> {
   public static string Value { get; set; }
}

et utilisez ProcessNames<DerivedClassType>.Value à la place. De toute évidence, la valeur sera accessible au public de cette façon.

Toutefois, vous devriez voir si la définition du champ dans chaque classe dérivée répond à vos besoins et ne recourir aux solutions de contournement que si cela ne convient pas.

Il existe de nombreuses façons de peler le chat. Voici une autre façon de le faire.

public class ClassA
{
    public string ProcessName{ get; private set;}

    public ClassA()
    {
        ProcessName = "ClassAProcess";
    }

    public ClassA(string processName)
    {
        ProcessName = processName;
    }
}

public class ClassB : ClassA
{
    public ClassB() : base("ClassAProcess")
    {
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top