Jon が既に説明したように (もちろん)、const の正確性は見た目ほど単純ではありません。C++ は 1 つの方法でそれを行います。Dは別の(おそらくより正確で便利な)方法でそれを行います。あなたが発見したように、C#はそれをいじりますが、それ以上大胆なことはしません(Jonが再びよくカバーしたように、決してうまくいかない可能性があります).
そうは言っても、Jon の「理論的理由」の多くは D のモデルで解決されていると思います。
D (2.0) では、const は C++ とほぼ同じように機能しますが、完全に推移的であることを除いて (したがって、ポインターに適用された const は、指されたオブジェクト、そのオブジェクトのメンバー、オブジェクトが持っていたポインター、それらが指していたオブジェクトなどに適用されます) ) - ただし、これがconst を宣言した変数からのみ適用されることは明らかです (したがって、既に非 const オブジェクトがあり、それへの const ポインターを取得する場合、非 const 変数は状態を変更できます)。
D では、オブジェクト自体に適用される別のキーワード invariant が導入されています。これは、一度初期化されると状態を変更できないことを意味します。
この配置の優れた点は、const メソッドが const オブジェクトと不変オブジェクトの両方を受け入れることができることです。不変オブジェクトは機能的な世界のパンとバターであるため、 const メソッドは機能的な意味で「純粋」とマークすることができます - 可変オブジェクトで使用することはできますが。
軌道に戻る - const (および不変式) の最適な使用方法を理解しているのは、今 (いたずらの後半) だけだと思います。.Net は元々、物事がより曖昧だったときに定義されたため、あまりコミットしませんでした。
D のポートが .Net VM で動作するのを見たいのですが:-)