2012-08-12 23 views
6

Esto podría ser downvoted, pero esta pregunta me ha estado molestando desde ayer .. hasta que encontré un enlace entonces supe que no estaba realmente loco lol: Enum as instance variables¿Por qué no podemos acceder a los valores enum desde una instancia enum en C#?

básicamente lo que estoy pidiendo lo contrario de la OP pregunta. Teniendo en cuenta:

enum Coffee { 
    BIG, 
    SMALL } 

public class MyClass { 
    private Coffee coffee; 

    // Constructor etc. 
} 

Aunque se trata de Java y enumeraciones difieren un tanto en los dos idiomas ¿Cómo es que no puedo hacer coffee.BIG o coffee.BIG.SMALL (aunque no tiene mucho sentido al leerlo, debería ser posible considerando que el café es de tipo Café) en C#?

Respuesta

10

Esto no es realmente que ver con las enumeraciones. Tiene que ver con acceder a miembros estáticos en general.

Java tiene una falla de diseño (IMO) que le permite acceder a los miembros estáticos como si fueran miembros de instancia, a través de una expresión de ese tipo. Puede conducir a muy confundir código:

Thread thread = new Thread(...); 
thread.start(); 
// This looks like it makes the new thread sleep, but it actually makes the 
// current thread sleep 
thread.sleep(1000); 

Además, no hay verificación de nulidad como el valor de la expresión es irrelevante:

Thread thread = null; 
thread.sleep(1000); // No exception 

Ahora, considere que los valores de enumeración son implícitamente estáticos y puedes ver por qué hay una diferencia.

El hecho de que usted ha reconocido que "no tiene mucho sentido cuando se lee que" sugiere que en el fondo está de acuerdo que este es un defecto dentro de Java, C# no dentro :)

+0

Oh sí, eso tiene mucho sentido ahora. Finalmente una respuesta! :PAG –

4

En C# (a diferencia de Java) no es legal acceder a un campo estático a través de una instancia de esa clase.

Si se escribe esto:

coffee.BIG.SMALL 

A continuación, el error que se obtiene es:

miembros coffee.SMALL 'no se puede acceder con una referencia de instancia; calificarla con un nombre de tipo de cambio

Este código también no va a funcionar por la misma razón:

void Foo(coffee c) 
{ 
    // Member 'coffee.SMALL' cannot be accessed with an instance reference 
    Console.WriteLine(c.SMALL); 
} 
+3

1 Y en su llano confuso Java. –

+0

Tiene perfecto sentido, gracias :) –