Oggi un collega mi ha fatto notare un'apparente anomalia che non avevo mai notato. L'invocazione del metodo QueryString::ToString(), es
...
Response.Write( QueryString.ToString() );
...
produce una rappresentazione testuale della query string (es. a=1&b=2). La cosa è logica se non fosse per il fatto che la proprietà QueryString di HttpRequest è di tipo System.Collections.Specialized.NameValueCollection, classe che non ridefinisce l'implementazione standard del metodo ToString() e che quindi dovrebbe restituire una stringa con il nome della classe ("System.Collections.Specialized.NameValueCollection" appunto).
In realtà la spiegazione si trova andando a decompilare il codice della proprietà HttpRequest::QueryString: il membro privato relativo alla proprietà viene inizializzato con una istanza della classe internal HttpValueCollection (derivata da NameValueCollection) ed esposto pubblicamente come tipo NameValueCollection. E' proprio la classe HttpValueCollection che ridefinisce il metodo ToString() e che quindi produce il comportamento apparentemente anomalo.