Me alegra que C# no le permita acceder a miembros estáticos como si fueran miembros de instancia. Esto evita un error común en Java:¿Por qué es útil acceder a miembros estáticos "a través de" tipos heredados?
Thread t = new Thread(..);
t.sleep(..); //Probably doesn't do what the programmer intended.
Por otro lado, se hace permitirá acceder a los miembros estáticos 'a' tipos derivados. Además de los operadores (donde te ahorra la escritura de moldes), no puedo pensar en ningún caso en el que esto sea realmente útil. De hecho, se anima activamente a errores tales como:
// 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);
yo personalmente sigo cometiendo errores similares una y otra vez cuando estoy buscando mi camino a través de las API no familiares (Recuerdo de comenzar con los árboles de expresión; golpeo BinaryExpression.
en el editor y me preguntaba por qué en la tierra IntelliSense me estaba ofreciendo MakeUnary
como una opción).
En mi opinión (miope), esta característica:
- No reduce el nivel de detalle; el programador tiene que especificar un nombre de tipo de una forma u otra (excluyendo operadores y casos cuando uno está accediendo a miembros estáticos heredados del tipo actual).
- Fomenta errores/código engañoso como el anterior.
- Puede sugerir al programador que los métodos estáticos en C# muestren algún tipo de 'polimorfismo', cuando no lo hacen.
- (Menor) Presenta las posibilidades de recombinación 'silenciosa', posiblemente no deseada, en la recompilación.
(OMI, los operadores son un caso especial que garantiza su propia discusión.)
Dado que C# es normalmente un "pozo del éxito" lenguaje, ¿por qué existe esta función? No puedo ver sus beneficios (aparte de la 'descubribilidad', que siempre podría resolverse en el IDE), pero veo muchos problemas.
O, lo que es peor, 'UTF8Encoding.ASCII'. – SLaks
Acepto que puede ser un poco engañoso, pero es coherente con el principio de que * los miembros heredados se tratan como miembros del tipo derivado *.Tenga en cuenta que explícitamente * no * permitimos este patrón en parámetros de tipo restringido porque entonces es potencialmente bastante engañoso. Consulte http://blogs.msdn.com/b/ericlippert/archive/2007/06/14/calling-static-methods-on-type-parameters-is-illegal-part-one.aspx para obtener más información. –