2012-08-12 18 views
6

Questo potrebbe ottenere downvoted, ma la questione è stato mi dà fastidio da ieri .. fino a quando ho trovato un link, allora ho capito che non ero lol veramente pazzo: Enum as instance variablesPerché non possiamo accedere ai valori enum da un'istanza enum in C#?

praticamente sto chiedendo l'opposto del PO di domanda. Dato:

enum Coffee { 
    BIG, 
    SMALL } 

public class MyClass { 
    private Coffee coffee; 

    // Constructor etc. 
} 

anche se questo è Java e le enumerazioni differiscono un po 'in entrambe le lingue come è possibile che non posso fare coffee.BIG o coffee.BIG.SMALL (anche se non ha molto senso, quando la lettura, dovrebbe essere possibile considerare che il caffè è di tipo Caffè) in C#?

risposta

10

Questo non è davvero a che fare con le enumerazioni. Ha a che fare con l'accesso ai membri statici in generale.

Java ha un difetto di progettazione (IMO) che consente di accedere ai membri statici come se fossero membri di un'istanza, tramite un'espressione di quel tipo. Si può portare a molto codice confondere:

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); 

Inoltre, non c'è alcun controllo nullità come il valoredell'espressione è irrilevante:

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

Ora, ritengo che i valori enum sono implicitamente statici e puoi capire perché c'è differenza.

Il fatto che hai riconosciuto che "non ha molto senso quando la lettura è" suggerisce che in fondo è d'accordo che si tratta di un difetto all'interno di Java, non all'interno di C# :)

+0

Oh sì, questo ha perfettamente senso ora. Finalmente una risposta! : P –

4

In C# (a differenza di Java) non è legale accedere a un campo statico tramite un'istanza di tale classe.

Se si scrive questo:

coffee.BIG.SMALL 

Quindi l'errore che si ottiene è:

Stati 'coffee.SMALL' non è possibile accedere con un riferimento istanza; qualificare con un nome di tipo invece

Questo codice, inoltre, non funziona per la stessa ragione:

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

+1 e la sua pianura confusione in Giava. –

+0

Ha perfettamente senso, grazie :) –