Mi fa piacere che C# non ti consenta di accedere ai membri statici "come se" fossero membri di istanze. Questo evita un errore comune in Java:Perché è utile accedere ai membri statici "attraverso" i tipi ereditati?
Thread t = new Thread(..);
t.sleep(..); //Probably doesn't do what the programmer intended.
D'altra parte, si fa permetterà di accedere membri statici 'attraverso' tipi derivati. Oltre agli operatori (dove ti evita di scrivere cast), non riesco a pensare a casi in cui ciò sia effettivamente utile. In realtà, si incoraggia attivamente errori come ad esempio:
// Nasty surprises ahead - won't throw; does something unintended:
// Creates a HttpWebRequest instead.
var ftpRequest = FtpWebRequest.Create(@"http://www.stackoverflow.com");
// Something seriously wrong here.
var areRefEqual = Dictionary<string, int>.ReferenceEquals(dict1, dict2);
Personalmente continuo a commettere simili errori più e più volte, quando sto cercando la mia strada attraverso le API sconosciute (ricordo partendo con alberi di espressione; mi ha colpito BinaryExpression.
nell'editor e mi chiedevo perché mai IntelliSense mi stesse offrendo MakeUnary
come opzione).
A mio parere (miopi), questa funzione:
- Non riduce la verbosità; il programmatore deve specificare un nome-tipo in un modo o nell'altro (esclusi operatori e casi in cui si accede ai membri statici ereditati del tipo corrente).
- Incoraggia bug/codice fuorviante come quello sopra.
- Può suggerire al programmatore che i metodi statici in C# mostrano una sorta di "polimorfismo", quando non lo fanno.
- (Minore) Introduce possibilità "silenziose", probabilmente involontarie, di rebinding sulla ricompilazione.
(IMO, gli operatori sono un caso speciale che garantisce la loro discussione.)
Dato che C# è normalmente un "pozzo di successo" la lingua, perché questa funzione esiste? Non riesco a vedere i suoi benefici (oltre alla "rilevabilità", che potrebbe essere sempre risolta nell'IDE), ma vedo molti problemi.
O, peggio, 'UTF8Encoding.ASCII'. – SLaks
Sono d'accordo che può essere leggermente fuorviante, ma è coerente con il principio che * i membri ereditati sono trattati come membri del tipo derivato *.Si noti che noi * esplicitamente * non permettiamo questo modello su parametri di tipo vincolato perché in questo caso è potenzialmente abbastanza fuorviante. Vedi http://blogs.msdn.com/b/ericlippert/archive/2007/06/14/calling-static-methods-on-type-parameters-is-illegal-part-one.aspx per i dettagli. –