web-dev-qa-db-fra.com

Déclarer un const double [] en C #?

J'ai plusieurs constantes que j'utilise, et mon plan était de les mettre dans un tableau const de doubles, mais le compilateur ne me le permet pas.

J'ai essayé de le déclarer de cette façon:

const double[] arr = {1, 2, 3, 4, 5, 6, 73, 8, 9 };

Ensuite, j'ai décidé de le déclarer statique en lecture seule:

static readonly double[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9};

Mais la question demeure. Pourquoi le compilateur ne me laisse-t-il pas déclarer un tableau de valeurs const? Ou bien, et je ne sais pas comment?

46
David Božjak

Depuis MSDN ( http://msdn.Microsoft.com/en-us/library/ms228606.aspx )

Une expression constante est une expression qui peut être entièrement évaluée au moment de la compilation. Parce que la seule façon de créer une valeur non nulle d'un type de référence [un tableau] est d'appliquer le nouvel opérateur, et parce que le nouvel opérateur n'est pas autorisé dans une expression constante, la seule valeur possible pour les constantes de référence- les types autres que chaîne sont nuls.

40
JohnFx

C'est probablement parce que

static const double[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9};

est en fait la même chose que de dire

static const double[] arr = new double[]{ 1, 2, 3, 4, 5, 6, 7, 8, 9};

Une valeur affectée à un const doit être ... const. Chaque type de référence n'est pas constant et un tableau est un type de référence.

La solution que ma recherche a montrée utilisait une lecture statique statique. Ou, dans votre cas avec un nombre fixe de doubles, donnez à tout un identifiant individuel.


Edit (2): Un petit sidenode, chaque type peut être utilisé const, mais la valeur qui lui est assignée doit être const. Pour les types de référence, la seule chose que vous pouvez affecter est null:

static const double[] arr = null;

Mais cela est complètement inutile. Les chaînes sont l'exception, ce sont aussi le seul type de référence qui peut être utilisé pour les arguments d'attribut.

46
Dykam

Il n'y a aucun moyen d'avoir un tableau const en C #. Vous devez utiliser des indexeurs, des propriétés, etc. pour vous assurer que le contenu du tableau n'est pas modifié. Vous devrez peut-être réévaluer le côté public de votre classe.

Juste pour souligner cependant ... Statique en lecture seule -IS PAS CONST-

Ceci est parfaitement valable et non ce que vous vouliez:

class TestClass
{
    public static readonly string[] q = { "q", "w", "e" };
}

class Program
{
    static void Main( string[] args )
    {
        TestClass.q[ 0 ] = "I am not const";
        Console.WriteLine( TestClass.q[ 0 ] );
    }
}

Vous devrez trouver d'autres moyens de protéger votre baie.

9
Karl Strings

Je ne sais pas pourquoi vous deviez le rendre constant ou en lecture seule. Si vous voulez vraiment rendre le tableau entier immuable, alors un simple mot-clé constant/readonly ne vous aidera pas, et ce qui est pire, cela pourrait également vous détourner dans le mauvais sens.

Pour tous les types de référence non immuables, les rendre en lecture seule signifie que vous ne pouvez jamais réaffecter la variable elle-même, mais le contenu est toujours modifiable. Voir l'exemple ci-dessous:

readonly double[] a = new double[]{1, 2, 3};
...
a = new double[] {2,3}; // this won't compile;
a[1] = 4; // this will compile, run and result the array to {1, 4, 3}

Selon votre contexte, il peut y avoir des solutions, l'une d'elles est, si ce dont vous avez vraiment besoin est une liste de double, List a = new List () {1,2,3,4,5} .AsReadOnly (); vous donnera une liste de double en lecture seule.

3
louis

Le problème est que vous déclarez un tableau constant de doubles, pas un tableau de doubles constants. Je ne pense pas qu'il existe un moyen d'avoir un tableau de constantes en raison de la façon dont les tableaux fonctionnent en C #.

2
Yohnny

erreur du compilateur vous indique exactement pourquoi vous ne pouvez pas le faire:

'arr' est de type 'double []'.
Un champ const d'un type de référence autre que string ne peut être initialisé qu'avec null.

1
LukeH