Come Jon ha già coperto (ovviamente) la correttezza costante non è così semplice come potrebbe sembrare. C++ lo fa in un modo. D lo fa in un altro modo (probabilmente più corretto/utile). C# flirta con esso ma non fa nulla di più audace, come hai scoperto (e probabilmente non andrà mai bene, come Jon ricoprì di nuovo).
Detto questo, credo che molte delle "ragioni teoriche" di Jon siano risolte nel modello di D.
In D (2.0), const funziona in modo molto simile al C++, tranne per il fatto che è completamente transitivo (quindi const applicato a un puntatore si applicherà all'oggetto puntato a, tutti i membri di quell'oggetto, qualsiasi puntatore dell'oggetto, oggetti hanno indicato ecc.) - ma è esplicito che questo solo si applica dalla variabile che hai dichiarato const (quindi se hai già un oggetto non-const e prendi un puntatore const su di esso, la variabile non const può ancora muta lo stato).
D introduce un'altra parola chiave - invariante - che si applica all'oggetto stesso. Ciò significa che nulla può mai cambiare lo stato una volta inizializzato.
La bellezza di questa disposizione è che un metodo const può accettare sia oggetti const sia oggetti invarianti. Poiché gli oggetti invarianti sono il pane e il burro del mondo funzionale, e il metodo const può essere contrassegnato come "puro" in senso funzionale, anche se può essere utilizzato con oggetti mutabili.
Rimettersi in carreggiata - Penso che sia il caso che siamo solo ora (la seconda metà degli ingenui) a capire come utilizzare al meglio const (e invariante). .Net è stato originariamente definito quando le cose erano più confuse, quindi non si è impegnato troppo - e ora è troppo tardi per il retrofit.
Mi piacerebbe vedere un porto di corsa D su .NET VM, anche se :-)
Grazie Jon. È illuminante. –