C'est juste un supplément pour les autres réponses. Je ne vais pas les répéter (maintenant quatre ans plus tard).
Il y a des situations où un const
et un non-const ont des sémantiques différentes. Par exemple:
const int y = 42;
static void Main()
{
short x = 42;
Console.WriteLine(x.Equals(y));
}
imprime True
, considérant ce qui suit:
static readonly int y = 42;
static void Main()
{
short x = 42;
Console.WriteLine(x.Equals(y));
}
écrit False
.
La raison en est que la méthode x.Equals
a deux surcharges, celle qui prend en short
(System.Int16
) et celui qui prend un object
(System.Object
). Maintenant, la question est de savoir si l'un ou les deux s'appliquent, avec mon y
argument.
Lors de l' y
est une constante de compilation (littérale), l' const
de cas, il devient important qu'il existe une conversion implicite de int
de short
à condition que l' int
est une constante, et à condition que le compilateur C# vérifie que sa valeur est dans la gamme d'un short
( 42
). Voir Implicite de l'expression constante de conversions dans la Spécification du Langage C#. Donc, à la fois les surcharges doivent être considérés. La surcharge Equals(short)
est préféré (tout short
est object
, mais pas tous, object
sont short
). Donc, y
est converti short
, et que la surcharge est utilisé. Ensuite, Equals
compare deux short
de la valeur identique, et qui donne des true
.
Lors de l' y
n'est pas une constante, pas d' implicite de conversion de int
de short
existe. C'est parce qu'en général, un int
peut être trop grande pour tenir dans une short
. ( Explicite de conversion n'existe pas, mais je n'ai pas dit Equals((short)y)
, ce qui n'est pas pertinent.) Nous voyons qu'un seul surcharge s'applique, l' Equals(object)
. Donc, y
est en boîte de object
. Ensuite, Equals
va comparer un System.Int16
d'un System.Int32
, et depuis le moment de l'exécution de types ne sont même pas d'accord, qui donnera false
.
Nous concluons que, dans certains (rares) cas, le changement d'un const
type de membre à un static readonly
domaine (ou dans l'autre sens, quand c'est possible) peut modifier le comportement du programme.