不変な値ってのには2つの意味があって、

1. 直定数(literal: 1 とか 0.5 みたいな数値)に名前が付いてるだけ。
 コンパイル結果がまさに定数。
2. コンパイラが不変な値と認識してるだけのもの。
 コンパイル結果は通常の変数と変わらないんだけど、
 プログラマが値を変更できないもの。

の2つある。
C# の const は 1 の意味でしか使えない。
readonly が 2 の意味に近いけど、readonly はプロパティとかを書きかえれちゃうんで不完全。

C++ の const は 2 の意味でも使える。
というか、大昔には 2 の意味でしか使えなかった(1 はマクロを使って定義)。