47 votes

Paramètres optionnels "doivent être une constante de compilation"

J'ai une classe divisée en deux fichiers partiels, comme ceci:

 public partial class PersonRepository : BaseRepository<Person>
{
    public static readonly string ColumnID = "ID";
    ...
 

et

 public partial class PersonRepository : BaseRepository<Person>
{
    public List<Person> GetByCompany(int companyID, string sortExpression = ColumnID)
    {
    ...
 

Mais le compilateur n'arrête pas de dire que sortExpression "doit être une constante de compilation". Pour moi, cela semble être une constante de compilation parfaite, je ne comprends donc pas où est le problème.

Merci de votre aide!

Alessandro

48voto

Jon Skeet Points 692016

Non, l'expression PersonRespository.ColumnID n'est pas classé comme une constante de compilation. L'expression "ID" est, mais ce n'est pas ce que vous êtes en utilisant comme paramètre par défaut.

En particulier, si l' ColumnID n'est "qu'un champ normal", alors toutes les références à elle sera traitée comme un domaine - si vous compilez une assemblée qui désigne le champ, puis modifiez la valeur et de la reconstruction de l'assemblée contenant PersonRepository, le renvoi de l'assemblée va voir le changement.

Si vous modifiez votre déclaration:

 public const string ColumnID = "ID";

ensuite, c' est une constante de compilation de l'expression. Cela signifie que dans notre précédent scénario, la valeur de la constante est cuit dans le code qui fait référence à elle - et à la modification de la valeur plus tard sans avoir à recompiler qu'en ce qui concerne le code de ne pas modifier la valeur utilisée par qui référence de code.

Voir l'article 7.19 du C# 4 spécification de langue pour plus de détails sur ce qui est considéré comme une expression constante.

5voto

Paolo Tedesco Points 22442

Vous devez déclarer votre ColumnID comme const .

La chaîne static readonly sera instanciée lors du premier accès à la classe dans votre code. Vous pouvez également l'initialiser avec la valeur de retour d'une méthode statique. Ce n'est donc pas une constante de compilation pour le compilateur (même si dans ce cas c'est évidemment pour une personne qui lit le code).

4voto

Hasan Khan Points 20723

const est quelque chose déclaré avec le mot clé const.

Le champ readonly peut être affecté dans le constructeur et sa constante de temps non compilée. le code que vous avez écrit maintenant s'exécute dans l'initialiseur (avant le constructeur). Les champs const sont "cuits" en tant que constantes.

3voto

Øyvind Bråthen Points 25211

changement

 public static readonly string ColumnID = "ID";
 

à

 public const string ColumnID = "ID";
 

2voto

archil Points 21369
public const string ColumnID = "ID";

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X